Является ли Entity Framework Code первым допускать плавные сопоставления в отдельных файлах?

Я разрабатываю довольно большую схему базы данных, используя First Entity Framework Code First. Я предпочитаю API Fluent над подходом Data Annotations, поскольку он оставляет объекты моего домена как простые POCO.

Чтобы использовать Fluent API, мне нужно переопределить OnModelCreating в классе, который наследуется от DbContext.

Мне не нравится, что все сопоставления для всех моих объектов находятся в этом методе. Раньше я использовал такие вещи, как FluentNHibernate, где каждый объект имеет собственный класс сопоставления. Есть ли у EF что-то подобное?

Я полагаю, что я мог бы создать свой собственный интерфейс для реализации класса сопоставления и вызвать их все в методе OnModelCreating. Я мог бы использовать отражение или IoC, чтобы обнаружить их все. Я особо не вижу ничего плохого в этом подходе, но мне было интересно, есть ли в Entity Framework уже что-то подобное из коробки?

Ответ 1

Вы можете создать один класс конфигурации для каждого объекта, полученный из EntityTypeConfiguration<TEntity>, и поместить эти классы в отдельные файлы. В производном DbContext вы добавляете экземпляры этих классов конфигурации в построитель моделей. Пример:

public class UserConfiguration : EntityTypeConfiguration<User>
{
    public UserConfiguration()
    {
        HasKey(u => u.UserName);

        Property(u => u.UserName)
            .HasMaxLength(50)
            .IsRequired();

        // etc.
    }
}

public class RoleConfiguration : EntityTypeConfiguration<Role>
{
    public RoleConfiguration()
    {
        HasKey(r => r.RoleName);

        // etc.
    }
}

Производный контекст:

public class MyContext : DbContext
{
    //...

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new UserConfiguration());
        modelBuilder.Configurations.Add(new RoleConfiguration());
    }
}

Существует также ComplexTypeConfiguration<T>, который вы можете использовать для конфигурирования сложных типов.