在.NET Core中使用DbModelBuilder来使用指定的命名约定

时间:2018-09-01 12:02:30

标签: c# .net .net-core dbcontext

在.NET中,我通常可以通过以下方式在所有列和表上指定命名约定

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder
        .Properties()
        .Where(p => p.Name == p.DeclaringType.Name + "_ID")
        .Configure(p => p.IsKey());

    base.OnModelCreating(modelBuilder);
}

但是在.NET Core中,我找不到执行此操作的方法。当我在.NET核心的DbContext继承的XYZContext中覆盖OnModelCreating()时,只有ModelBuilder

.NET核心中是否有上述方法?还是必须手动指定每一列?

2 个答案:

答案 0 :(得分:1)

ModelBuilder允许类似的功能:

var keyProperties = modelBuilder
    .Model
    .GetEntityTypes()
    .SelectMany(e => e.GetProperties())
    .Where(p => p.Name == p.DeclaringEntityType.ClrType.Name + "_ID")
    .ToList();

foreach (var p in keyProperties)
{
    modelBuilder
        .Entity(p.DeclaringEntityType.Name)
        .HasKey(p.Name);
}

答案 1 :(得分:0)

它内置在ModelBuilder中。

致电modelBuilder.Model.GetEntityTypes()获取类型

要更改表名,请使用下面的代码行

entityType.Relational().TableName = ConvertToUpperCaseUnderscore(entityType.ClrType.Name);

要使用相同的约定将属性映射到列,请调用entityType.GetProperties()获取属性列表,然后映射列名称。

因此,总体使用情况是

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    foreach (var entityType in modelBuilder.Model.GetEntityTypes())
    {
        if (entityType.ClrType == null)
        {
            continue;
        }

        // Set the table name mapping for the class
        entityType.Relational().TableName = ConvertToUpperCaseUnderscore(entityType.ClrType.Name);

        var props = entityType.GetProperties().ToList();

        foreach (var p in props)
        {
            // Set the column name mapping for the class
            p.Relational().ColumnName = ConvertToUpperCaseUnderscore(p.Name);
        }
    }

    base.OnModelCreating(modelBuilder);
}
相关问题