Estoy intentando usar una clase común EntityTypeConfiguration para configurar la clave primaria para todas mis entidades, de modo que cada clase de configuración derivada no se repita. Todas mis entidades implementan una interfaz común IEntity (que dice que cada entidad debe tener una propiedad Id de tipo int).Entity Framework 4.1 RC: Código First EntityTypeConfiguration inheritance issue
Mi clase de base de configuración tiene el siguiente aspecto:
public class EntityConfiguration<TEntity> : EntityTypeConfiguration<TEntity>
where TEntity : class , IEntity {
public EntityConfiguration() {
HasKey(e => e.Id);
Property(e => e.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
}
}
Cada entidad a continuación, tiene su propia clase de configuración específica que se extiende ésta como esto:
public class CustomerConfiguration : EntityConfiguration<Customer> {
public CustomerConfiguration() : base() {
// Entity specific configuration here
}
}
Se compila bien, pero el problema soy teniendo es que en el tiempo de ejecución me aparece la siguiente excepción cuando EF 4.1 RC intenta crear el modelo:
System.InvalidOperationException era no administrado Mensaje = El componente clave 'Id' no es una propiedad declarada en tipo 'Cliente'. Compruebe que tiene no se ha excluido explícitamente del modelo y que es una propiedad primitiva válida . Fuente = ADO.NET Entity Framework
Si cambio de la clase CustomerConfiguration para extenderse desde EntityTypeConfiguration <cliente> y repetir la configuración de clave principal entonces funciona bien, pero pierdo la capacidad de compartir configuración común (principal DRY es la motivación).
- ¿Estoy haciendo algo mal aquí?
- ¿Hay alguna otra manera de compartir la configuración común entre las entidades?
Como referencia aquí son las otras clases involucradas:
public interface IEntity {
int Id { get; set; }
}
public class Customer : IEntity {
public virtual int Id { get; set; }
public virtual string name { get; set; }
}
Gracias!
Sí, eso es cierto, pero personalmente no me gusta depender de las convenciones y, cuando sea posible, quiero que la configuración sea explícita, autocomprimible y bajo control de versiones. Tarde o temprano, es posible que algo no encaje dentro de las convenciones, por lo que estos problemas deberían resolverse por adelantado. También hay alguna configuración compartida que no se muestra en este ejemplo simplificado que no estoy seguro de que la convención pueda manejar automáticamente. – Jamie
"No me gusta depender de las convenciones" - luego escriba una prueba y fallará cuando la convención cambie, Documentar el hecho (en código o de otro modo) es un enfoque menos que ideal – RhysC