Разрешает ли Entity Framework Code First свободное сопоставление в отдельных файлах?

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

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

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

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


person Matt Johnson-Pint    schedule 30.11.2011    source источник


Ответы (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>, из которого вы можете настраивать сложные типы.

person Slauma    schedule 30.11.2011
comment
Это почти необходимо при работе с большими сложными моделями. В противном случае вам придется поместить все это в один метод OnModelCreating. - person Tony; 01.04.2015