Warum ist die erste Proxy-Sammlung meines Entity Framework-Codes ungültig und warum kann ich sie nicht festlegen?
Bin ich mit dem DBContext und haben zwei Klassen, deren Eigenschaften sind alle virtuellen. Ich sehe im debugger, dass ich immer ein proxy-Objekt, wenn ich der Abfrage den Kontext. Jedoch, eine Sammlung, die Immobilie ist immer noch null, wenn ich versuchen, um es hinzuzufügen. Ich dachte, dass der proxy würde gewährleisten, dass die Kollektion ist initialisiert.
Weil meine Poco-Objekt kann verwendet werden, außerhalb der Daten-Kontext, ich Hinzugefügt eine überprüfung für die collection null im Konstruktor, und erstellen Sie ihn, falls erforderlich:
public class DanceStyle
{
public DanceStyle()
{
if (DanceEvents == null)
{
DanceEvents = new Collection<DanceEvent>();
}
}
...
public virtual ICollection<DanceEvent> DanceEvents { get; set; }
}
Dass arbeiten außerhalb der Daten-Kontext, aber wenn ich wieder ein Objekt mit einer Abfrage, obwohl der test ist wahr, wenn ich versuche es einzustellen, bekomme ich folgende exception: 'Die Eigenschaft 'DanceEvents' Typ 'DanceStyle_B6089AE40D178593955F1328a70eaa3d8f0f01dde9f9fbd615f60a34f9178b94' kann nicht gesetzt werden, weil die Sammlung ist bereits auf eine EntityCollection.'
Ich es sehen kann, ist null und ich kann nicht, um es hinzuzufügen, aber weder kann ich auf eine Auflistung, weil der proxy sagt es bereits. Also ich kann es nicht benutzen. Ich bin verwirrt.
Hier ist das DanceEvent Klasse:
public class DanceEvent
{
public DanceEvent()
{
if (DanceStyles == null)
{
DanceStyles = new Collection<DanceStyle>();
}
}
...
public virtual ICollection<DanceStyle> DanceStyles { get; set; }
}
Habe ich weggelassen, die anderen Wert-Typ-Eigenschaften aus dem obigen code. Ich habe keine anderen Zuordnungen für diese Klassen in der Kontext-Klasse.
InformationsquelleAutor der Frage Rob Kent | 2010-11-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie Sie richtig beobachtet, in der Antwort auf Ihre eigene Frage, entfernen Sie den "virtual" - Schlüsselwort aus der Sammlung von Eigenschaften funktioniert, um das problem durch die Verhinderung von Entity Framework und die Erstellung eines change-tracking-proxy. Dies ist jedoch nicht eine Lösung für viele Menschen, weil die änderungsnachverfolgung Proxys kann wirklich praktisch und kann helfen, verhindern, dass Probleme auftreten, wenn Sie vergessen, um änderungen zu erkennen an den richtigen stellen im code.
Ein besserer Ansatz wäre, um ändern Sie Ihre POCO-Klassen, so dass Sie instanziieren die Sammlung Eigenschaften in den get-accessor, sondern im Konstruktor. Hier ist die POCO-Klasse, modifiziert, um zu erlauben, ändern tracking-proxy-Erstellung:
Im obigen code die "collection" - Eigenschaft ist nicht mehr automatisch, sondern ein Feld sichern. Es ist besser, wenn Sie lassen Sie die Set-geschützt und verhindert, dass code (außer der proxy) von der anschließend die änderung dieser Eigenschaften. Sie werden feststellen, dass der Konstruktor nicht mehr notwendig und wurde entfernt.
InformationsquelleAutor der Antwort Pando
Fand ich die Lösung zu diesem problem hier: Die Erste Code hinzufügen, um die Sammlungen? Wie Sie Code First mit repositories?
Habe ich entfernt, "virtuelle" von allen Eigenschaften mit Ausnahme von Sammlungen und lazy geladene Objekte, das heißt, alle einheimischen Arten.
Aber ich verstehe immer noch nicht, wie Sie können am Ende mit der situation, wo Sie haben eine null-collection, die Sie nicht verwenden und haben keine Möglichkeit, es zu einem gültigen Kollektion.
Fand ich auch diese Antwort von Rowan Miller auf eine MSDN-forum
So scheint es, dass ich nur noch das problem mit einer vollen "change tracking-proxy', wenn alle meine Eigenschaften sind virtuelle. Aber angesichts der Tatsache, dass, warum kann ich immer noch nicht mit der virtuellen Immobilie auf der änderungsnachverfolgung proxy? Dieser code Schläge bis auf drei, weil ds2.DanceEvents ist null und kann nicht eingestellt werden im Konstruktor:
Ich bin immer noch verwirrt, obwohl mein code ist jetzt an der Arbeit, weil der fix oben.
InformationsquelleAutor der Antwort Rob Kent
Alte Frage...
Poco-Klasse:
- und proxy-code:
Wie Sie sehen können, dass die Ausnahme ausgelöst, die in der proxy-Klasse in ExtityFramework 5. Dies bedeutet, dass das Verhalten immer noch vorhanden ist.
InformationsquelleAutor der Antwort Ayhan