Ho una classe di entità di base MyCompany.Core.Model.User
che deve essere utilizzata per le proprietà comuni di un'entità User
:
public class User
{
public string Username { get; set; }
public string Usercode { get; set; }
}
Ho anche una classe di mappatura di base MyCompany.Core.Model.UserMap
per configurare i primi mapping del codice per la classe 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");
}
}
In un assembly separato ho una classe derivata MyCompany.Model.User
che eredita dalla classe User
base e la estende con alcune proprietà aggiuntive:
public class User : Core.User
{
public string Surname { get; set; }
}
Inoltre, ho una classe di mapping derivata MyCompany.Model.UserMap
per fornire la configurazione aggiuntiva per le proprietà aggiuntive:
public class UserMap : Core.UserMap<User>
{
public UserMap()
{
this.Property(t => t.Surname).HasColumnName("Surname");
}
}
Tuttavia, quando si aggiunge MyCompany.Model.User
al contesto e si registra MyCompany.Model.UserMap
viene visualizzato il seguente errore:
Il tipo "MyCompany.Model.User" e il tipo "MyCompany.Core.Model.User" hanno entrambi lo stesso nome semplice di "Utente" e quindi non possono essere utilizzati nello stesso modello. Tutti i tipi in un determinato modello devono avere nomi semplici univoci. Utilizzare 'NotMappedAttribute' o chiamare Ignore nel codice Prima API fluente per escludere esplicitamente una proprietà o un tipo dal modello.
Questo link indica che non è possibile avere lo stesso "nome semplice" nel modello due volte.
Perché la classe base "nome semplice" viene registrata nel modello e c'è un modo per aggirare questo tipo di eredità di entità?
Sospetto che la soluzione semplice sarebbe quella di rinominare la classe derivata; tuttavia preferirei evitare questo perché potrebbero esserci molte derivazioni in più contesti.
Nota: utilizzo di Entity Framework 6.0.0-rc1 (pre-release)
Questa è una limitazione di EF che ho segnalato nel 2012 https://entityframework.codeplex.com/workitem/483 che non è ancora implementato in 6.0.2. EF utilizza un'architettura interna piatta e non riconosce gli spazi dei nomi. Potrebbe venire in EF7, ma non prima. Per ora l'unica soluzione è rinominare le due classi in nomi di classi univoche indipendentemente dallo spazio dei nomi in cui si trovano. IMHO, questa è una limitazione significativa all'interno di EF. Prendi in considerazione una classe di nome Category e quanti spazi dei nomi diversi potrebbero essere utilizzati all'interno di un dominio.
Prima leggi i mapping dei tipi di tabella
Le opzioni del modello di implementazione gerarchica devono essere capite prima. Quindi guarda l'opzione IGNORE. Potrebbe essere necessario o meno a seconda dell'approccio scelto.
richiede ignorare ???
modelBuilder.Ignore<BaseXYZ>()
Ef sta attualmente cercando di includere la classe base per supportare un Tipo incluso che eredita da una classe NON astratta.