代码之家  ›  专栏  ›  技术社区  ›  Omar.Ebrahim

在.NET核心中使用DbModelBuilder来指定命名约定

  •  0
  • Omar.Ebrahim  · 技术社区  · 6 年前

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

    但在.NETCore中,我找不到这样做的方法。当我重写 OnModelCreating() ModelBuilder

    有没有办法在.NETCore中执行上述操作,或者我必须手动指定每一列?

    2 回复  |  直到 6 年前
        1
  •  2
  •   Ňuf    6 年前

    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);
    }
    
        2
  •  0
  •   Omar.Ebrahim    6 年前

    它内置在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);
    }