Позволяет ли Entity Framework Code First свободно отображать отдельные файлы? - PullRequest
12 голосов
/ 30 ноября 2011

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

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

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

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

1 Ответ

28 голосов
/ 30 ноября 2011

Вы можете создать один класс конфигурации для объекта, производного от 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>, который вы можете использовать для настройки сложных типов.

...