¿Puedo especificar las reglas de mapeo globales en Entity Framework Code First?

Estoy construyendo una aplicación en ASP.NET MVC 4 utilizando Entity Framework Code First, y por simplicidad heredaré todos los modelos que se almacenarán en la base de datos desde una BaseEntity que tenga un Guid, un DateCreated, un LastEditDate y otro propiedades útiles como esa. Ahora, sé que puedo decirle a EF que trace estas propiedades heredadas así:

protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity().Map(m => { m.MapInheritedProperties(); }); modelBuilder.Entity().Map(m => { m.MapInheritedProperties(); }); } 

Sin embargo, parece una tontería tener que hacer esto para cada artículo. ¿Hay alguna manera de aplicar esta regla a todas las entidades en una?

Se ha indicado correctamente que no es necesario hacer un mapeo global en este caso específico, porque EF BaseEntity las propiedades para cada tipo individual siempre y cuando no haga de BaseEntity parte del modelo.

Pero el título de su pregunta se establece de manera más general y sí, es posible especificar reglas de asignación globales si configura las asignaciones mediante EntityTypeConfiguration s. Podría verse así:

 // Base configuration. public abstract class BaseMapping : EntityTypeConfiguration where T : BaseEntity { protected BaseMapping() { this.Map(m => m.MapInheritedProperties()); // OK, not necessary, but // just an example } } // Specific configurations public class UserMapping : BaseMapping { } public class ProductMapping : BaseMapping { } public class TempModelsContext : DbContext { // Add the configurations to the model builder. protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Configurations.Add(new UserMapping()); modelBuilder.Configurations.Add(new ProductMapping()); } // DbSets ... } 

NOTA:

A partir de Entity Framework 6, algunas de estas asignaciones también se pueden resolver mediante convenciones de códigos personalizados: http://romiller.com/2013/01/29/ef6-code-first-configuring-unmapped-base-types/

Tal mapeo, llamado mapeo de herencia de tipo Tabla-Por-Concreto-Tipo (TPC), solo tiene sentido si realmente quieres aprovechar el polymorphism, por ejemplo, si quieres cargar una lista de decir 10 objetos BaseEntity y esperar que el tipo real se BaseEntity materializado para que la lista contenga 3 entidades de User y 7 entidades de Product .

¿Alguna consulta tendrá alguna relevancia comercial en su aplicación? Al mirar tu BaseEntity , solo puedo ver que consultar todos los objetos que, por ejemplo, se crearon en una fecha específica, sin importar qué tipo tenga (si se deriva de BaseEntity ), podría ser útil. ¿Lo necesitas? También tenga en cuenta qué tan compleja sería esta consulta. El SQL debe consultar casi todas las tablas en su base de datos y luego unir el resultado.

Utilizaría el mapeo de herencia solo si tiene un significado comercial real (por ejemplo: Person que tiene propiedades significativas como dirección, teléfono, correo electrónico, etc. por sí mismo y Employee que se deriva de Person y agrega una propiedad Salary y HiredDate , etc. .).

En su caso, usaría BaseEntity solo como un tipo base de las clases de entidad y no especificaría ningún tipo de mapeo para esta clase. EF seguirá mapeando las propiedades heredadas, pero como parte de la entidad de User y Product , etc., no como su propia entidad. Ni siquiera lo llamaría ” Entidad base”, pero … No sé … tal vez EntityBase (es decir: la base (clase) de todas las entidades, pero no una entidad en sí misma).