type tutorial tph per mvc herencia framework first espaƱol code entity-framework inheritance ef-code-first entity entity-framework-6

entity framework - tutorial - El tipo ''Company.Model.User'' y el tipo ''Company.Core.Model.User'' tienen el mismo nombre simple de ''Usuario'' y, por lo tanto, no se pueden usar en el mismo modelo



hierarchy entity framework (3)

Tengo una clase de entidad base MyCompany.Core.Model.User que se utilizará para las propiedades comunes de una entidad de User :

public class User { public string Username { get; set; } public string Usercode { get; set; } }

También tengo una clase de asignación base MyCompany.Core.Model.UserMap para configurar las asignaciones del código primero para la clase de User base:

public class UserMap<TUser> : EntityMapBase<TUser> where TUser : User { public UserMap() { // Primary Key this.HasKey(t => t.Usercode); // Table & Column Mappings this.ToTable("Users"); this.Property(t => t.Username).HasColumnName("Username"); this.Property(t => t.Usercode).HasColumnName("UserCode"); } }

En un conjunto separado, tengo una clase derivada MyCompany.Model.User que hereda de la clase de User base y la extiende con algunas propiedades adicionales:

public class User : Core.User { public string Surname { get; set; } }

Además, tengo una clase de asignación derivada MyCompany.Model.UserMap para proporcionar la configuración adicional para las propiedades adicionales:

public class UserMap : Core.UserMap<User> { public UserMap() { this.Property(t => t.Surname).HasColumnName("Surname"); } }

Sin embargo, al agregar MyCompany.Model.User al contexto y registrar MyCompany.Model.UserMap , MyCompany.Model.UserMap el siguiente error:

El tipo ''MyCompany.Model.User'' y el tipo ''MyCompany.Core.Model.User'' tienen el mismo nombre simple de ''Usuario'' y, por lo tanto, no se pueden usar en el mismo modelo. Todos los tipos en un modelo dado deben tener nombres simples únicos. Use ''NotMappedAttribute'' o llame a Ignore en la API fluida de Code First para excluir explícitamente una propiedad o tipo del modelo.

Este link indica que no puede tener el mismo "nombre simple" dos veces en el modelo.

¿Por qué la clase base "nombre simple" se está registrando en el modelo, y hay una forma de evitarlo para implementar este tipo de herencia de entidad?

Sospecho que la solución simple sería cambiar el nombre de la clase derivada; sin embargo, preferiría evitar esto, ya que puede haber muchas derivaciones en múltiples contextos.

Nota: Uso de Entity Framework 6.0.0-rc1 (versión preliminar)


Esta es una limitación de EF que informé en 2012 https://entityframework.codeplex.com/workitem/483 que aún no está implementado en 6.0.2. EF utiliza una arquitectura interna plana y no reconoce los espacios de nombres. Podría venir en EF7 pero no antes. Por ahora, la única solución es cambiar el nombre de las dos clases a nombres de clase únicos, independientemente del espacio de nombres en el que se encuentren. En mi humilde opinión, esta es una limitación importante dentro de EF. Simplemente considere una clase llamada Categoría y cuántos espacios de nombres diferentes podría usarse dentro de un dominio.


Para mantener el mismo nombre de clase sugiero usar diferentes interfaces. Una interfaz para la Core.Entity que define las propiedades comunes y otra interfaz para las propiedades adicionales. Entonces, en lugar de usar una clase derivada, usas una clase que implementa las dos interfaces.


Primero leer las asignaciones de tipo de tabla

Las opciones del modelo de implementación jerárquica deben entenderse primero. Luego mira la opción IGNORE. Puede o no puede necesitar dependiendo del enfoque elegido.
requiere ignorar ???

modelBuilder.Ignore<BaseXYZ>()

Ef está intentando incluir su clase base para admitir un tipo incluido que hereda de una clase abstracta NO.