Правильный способ совместной реализации Соглашения об именовании и аннотаций данных в Entity Framework Core - PullRequest
2 голосов
/ 26 июня 2019

Я использую Entity Framework Core 2.2, и все имена таблиц базы данных являются единственными, поэтому я overriding соглашение о множественном именовании в OnModelCreating метод

 protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            foreach (IMutableEntityType entityType in modelBuilder.Model.GetEntityTypes())
            {
                entityType.Relational().TableName = entityType.DisplayName();
            }
        }

Однако в некоторых случаях имена сущностей отличаются от имен таблиц, например

[Table("AzureSchemaVersionExecutionExtract", Schema = "dbo")]
    public class AzureDataExtract
    {
        public int Id { get; set; }
        public DateTime  DateApplied { get; set; }
    }

Когда я запускаю проект, он жалуется, так как не может найти таблицу AzureDataExtract, поэтому я добавил следующий код в метод OnModelCreating, и он работает. Мне нужно знать, это правильный способ реализации Data Annotations и Singular Naming Convention вместе

protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            foreach (IMutableEntityType entityType in modelBuilder.Model.GetEntityTypes())
            {
                entityType.Relational().TableName = entityType.DisplayName();
            }
            modelBuilder.Entity<AzureDataExtract>().ToTable("AzureSchemaVersionExecutionExtract","dbo");
        }

1 Ответ

3 голосов
/ 26 июня 2019

Это возможно, но не с публичным API.Но вы уже используете методы из Microsoft.EntityFrameworkCore.Metadata.Internal пространства имен, так что это не должно быть проблемой - просто проверьте, изменилось ли что-то при обновлении до более новой версии EF Core, и обновите соответственно.

В EF Core 2.2Хитрость заключается в том, чтобы использовать внутренний метод Relational(), принимающий ConfigurationSource и проходящий ConfigurationSource.Convention.Аннотации данных и обычный свободный API имеют более высокий приоритет, поэтому это будет переопределять только внутреннее соглашение об именах таблиц EF Core, в котором используется имя DbSet.

foreach (var entityType in modelBuilder.Model.GetEntityTypes().Where(t => !t.IsOwned())
{
    entityType.AsEntityType().Builder.Relational(ConfigurationSource.Convention)
        .ToTable(entityType.DisplayName());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...