2011-11-30 8 views
10

Estoy desarrollando un esquema de base de datos bastante grande utilizando Entity Framework Code First. Prefiero la API Fluent sobre el enfoque de Anotaciones de datos, ya que deja mis objetos de dominio como simples POCO.¿El código de Entity Framework primero permite mapeos fluidos en archivos separados?

Para utilizar la API Fluent, tengo que anular OnModelCreating en la clase que hereda de DbContext.

No me gusta que todas las asignaciones para todas mis entidades estén en este único método. He usado cosas como FluentNHibernate antes, donde cada entidad tiene su propia clase de mapeo. EF tiene algo similar?

Supongo que podría crear mi propia interfaz para implementar una clase de asignación y llamarlos a todos dentro del método OnModelCreating. Podría usar el reflejo o un IoC para descubrirlos todos. En particular, no veo nada malo con este enfoque, pero me preguntaba si Entity Framework ya viene con algo así de listo.

Respuesta

27

Puede crear una clase de configuración por entidad derivada de EntityTypeConfiguration<TEntity> y colocar estas clases en archivos separados. En su derivado DbContext, agrega instancias de esas clases de configuración al generador de modelos. Ejemplo: contexto

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

Derivado:

public class MyContext : DbContext 
{ 
    //... 

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

También hay un ComplexTypeConfiguration<T> se puede derivar de configurar los tipos complejos.

+3

+1 por incluir mención de 'ComplexTypeConfiguration ' – vossad01

+0

En general, ¿este enfoque se considera una buena práctica? –

+1

Es casi necesario cuando se trata de modelos complejos grandes. De lo contrario, tienes que ponerlo todo en un solo método OnModelCreating. – Tony

Cuestiones relacionadas