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.