Sto utilizzando DBContext e ho due classi le cui proprietà sono tutte virtuali. Posso vedere nel debugger che sto ottenendo un oggetto proxy quando interrogo il contesto. Tuttavia, una proprietà di raccolta è ancora nullo quando provo ad aggiungerla. Pensavo che il proxy avrebbe assicurato che la raccolta fosse inizializzata.Perché il mio Entity Framework Code Prima raccolta proxy nullo e perché non posso impostarla?
Perché il mio oggetto Poco può essere utilizzato al di fuori del suo contesto di dati, ho aggiunto un controllo per la raccolta essere nullo nel costruttore e creare, se necessario:
public class DanceStyle
{
public DanceStyle()
{
if (DanceEvents == null)
{
DanceEvents = new Collection<DanceEvent>();
}
}
...
public virtual ICollection<DanceEvent> DanceEvents { get; set; }
}
che funziona al di fuori del contesto dati, ma se Ricevo un oggetto usando una query, sebbene il test sia vero, quando provo ad impostarlo, ottengo la seguente eccezione: 'La proprietà' DanceEvents 'sul tipo' DanceStyle_B6089AE40D178593955F1328A70EAA3D8F0F01DDE9F9FBD615F60A34F9178B94 'non può essere impostata perché la raccolta è già impostata su EntityCollection. '
Posso vedere che è null e non posso aggiungerlo, ma nemmeno posso impostarlo su una raccolta perché il proxy dice che è già impostato. Quindi non posso usarlo. Non ho capito bene.
Qui è la classe DanceEvent:
public class DanceEvent
{
public DanceEvent()
{
if (DanceStyles == null)
{
DanceStyles = new Collection<DanceStyle>();
}
}
...
public virtual ICollection<DanceStyle> DanceStyles { get; set; }
}
ho omesso le altre proprietà tipo valore dal codice precedente. Non ho altri mapping per quelle classi nella classe di contesto.
Questo è un altro modo per farlo ma non spiega il mio commento: "Funziona al di fuori del contesto dati, ma se recupero un oggetto usando una query, anche se il test è vero, quando provo ad impostarlo, io ottieni la seguente eccezione: 'La proprietà' DanceEvents 'sul tipo' DanceStyle_B6089AE40D178593955F1328A70EAA3D8F0F01DDE9F9FBD615F60A34F9178B94 'non può essere impostata perché la raccolta è già impostata su EntityCollection.' Posso vedere che è nullo e non posso aggiungerlo, ma nemmeno posso impostarlo su una raccolta perché il proxy dice che è già impostato, quindi non posso usarlo, sono confuso. " –
Non riesco a riprodurre ciò che stai descrivendo. Nella mia esperienza, quando l'entità viene creata un'istanza come proxy (o come risultato del fatto che viene restituita da una query o se si utilizza il metodo DbSet.Create), le sue proprietà di raccolta vengono create un'istanza con gli oggetti EntityCollection. Non dovresti mai dover impostare queste proprietà - basta aggiungere/rimuovere entità da esse. – Pando
È possibile che il comportamento sia cambiato da quando ho scritto la mia domanda 2 anni fa. –