Используйте DbModelBuilder в .NET Core, чтобы использовать определенные соглашения об именах - PullRequest
0 голосов
/ 01 сентября 2018

В .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 я не могу найти способ сделать это. Когда я переопределяю OnModelCreating() в XYZContext, который наследуется от DbContext в ядре .NET, у меня появляется только ModelBuilder

Есть ли способ сделать это в ядре .NET или мне нужно указывать каждый столбец вручную?

Ответы [ 2 ]

0 голосов
/ 01 сентября 2018

Он встроен в 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);
}
0 голосов
/ 01 сентября 2018

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);
}
...