Questa è la mia prima domanda, quindi se ci sono problemi di formattazione o formulazioni poco chiare, per favore non esitare a dirmelo.
Ho un'entità chiamata Item che, oltre ad altre proprietà ha due link ad altri elementi ("GlobalItem" e "DepositItem") nello stesso DBSet.
public class Item
{
public int ItemID { get; private set; }
public virtual Item GlobalItem { get; set; }
public virtual Item DepositItem { get; set; }
protected Item() { }
}
La mappatura è fatta in questo modo:
public ItemMap()
{
HasKey(o => o.ItemID);
ToTable("Item", "dbo");
// Relationships
HasOptional(o => o.GlobalItem)
.WithMany()
.Map(m => m.MapKey("GlobalItemID"));
HasOptional(o => o.DepositItem)
.WithMany()
.Map(m => m.MapKey("DepositItemID"));
}
Il processo di compilazione ha esito positivo, ma quando provo a GetAll () viene generata la seguente eccezione:
System.Data.Entity.Core.EntityCommandExecutionException: "Si è verificato un errore durante l'esecuzione della definizione del comando. Vedi l'eccezione interna per i dettagli. '
Eccezione interna:
SqlException: nome colonna "DepositItem_ItemID" non valido.
Nome colonna "DepositItem_ItemID" non valido.
Nome colonna "DepositItem_ItemID" non valido.
So che questa eccezione di solito è causata da semplici errori di mappatura, ma in questo caso sono bloccato, poiché mi sono assicurato che ColumnName e MapKey siano corretti, e tutte le solite soluzioni alternative come la definizione esplicita di DepositItemID nell'entità e l'utilizzo .HasForeignKey(k = k.DepositItemID)
anziché la precedente definizione di mappatura non ha cambiato nulla.
L'EF6 ha un problema generale con più di una proprietà virtuale autoreferenziale? Qualcuno può spiegarmi perché la chiave di mappatura viene ignorata per DepositItem, ma non ignorata per GlobalItem? Qualcuno può trovare un difetto nel mio design?
Cordiali saluti e grazie per i vostri sforzi,
Il modello di elemento e la mappatura vanno bene.
Il problema era causato da una vecchia proprietà di navigazione, chiamata anche "DepositItem", in un'altra entità che non era mappata nel database.