2009-05-21 6 views
4

Derzeit habe ich mit einem Entity Framework-Problem zu kämpfen. Ich habe einen WCF-Service, der auf dem ef-Framework sitzt und Abfragen an das Framework erlaubt. Irgendwann kann der Benutzer eine Datei vom Framework anfordern. Die Dateien werden durch Lösungseinträge referenziert. Wenn Sie also eine Datei aus einer Lösung anfordern, wird die Referenz geladen, um Zugriff auf den Dateispeicher zu erhalten.Entladen einer Datenreferenz in Entity Framework

Das funktioniert alles gut, aber ab diesem Punkt, wenn Sie eine weitere Abfrage, die diesen Lösungseintrag zurückgibt, wird die gesamte Datei an das Ergebnis zurückgegeben. Ich brauche eine Möglichkeit, die Referenz zu lösen oder zu entladen, so dass die Ergebniseinträge nur noch eine nicht geladene Referenz auf den Dateispeicher enthalten.

Ich habe versucht, einen neuen Kontext zu erstellen und diesen Kontext abzufragen, um Informationen abzurufen, aber wenn ich das tue, wird auch die Entität im ursprünglichen Kontext geändert.

Ich habe versucht, die Entität aus dem ursprünglichen Kontext zu lösen und dann aus dem neuen Kontext abfragen. Das funktioniert auch nicht.

Ich habe einen Weg gefunden, dies zu tun. Für alle Nicht-Datei-Download-Abfragen lösche ich die Ergebniseinheit und sende sie über die Leitung. Ich bin mir nicht sicher, ob das der beste Weg ist.

Ich hoffe, jemand könnte einige Einblicke geben, danke für die Mühe.

+0

können Sie klären, wie Sie den WCF-Dienst hosten (selbst gehostet oder IIS gehostet) und erläutern, was Sie mit der in den Dateien enthaltenen Lösungsreferenz meinen (wie steht die Referenz zu den Dateien)? –

+0

Die Site wird von IIS gehostet, und die Referenzen beziehen sich aufgrund von Entity Framework auf die Dateien. Die Dateien befinden sich in einer separaten Tabelle, sind jedoch über einen externen Schlüssel mit den Informationstabellen verknüpft. Um aus der Informationstabelle auf die verknüpfte Entität zuzugreifen, müssen Sie die Dateireferenz laden. Sobald das Lazy-Laden stattfindet, können Sie die Verbindung nicht trennen. – Johannes

+0

Meinen Sie, alle Dateien sind in der Datenbank und Sie haben einen Entitätstyp für die Dateien? Wenn ja, wenn Sie sagen, dass Sie versucht haben, Entitäten zu trennen, ist das "Lösung" Entitäten oder Dateientitäten? Letzteres sollte funktionieren. – Marcanpilami

Antwort

0

Das Problem, das Sie erfahren, ist wahrscheinlich zu Änderung Tracking, die standardmäßig aktiviert ist.

Mögliche Lösung:

Disable Änderungsverfolgung mit MergeOption.NoTracking

using (MyEntities _context = new MyEntities()) 
{ 
    _context.Widgets.MergeOption = MergeOption.NoTracking; 

    return _context.Widgets.ToList(); 

} 

Diese article kann Ihnen helfen, in die richtige Richtung zu zeigen, wie dieses Problem zu umgehen, wenn die Lösung oben funktioniert nicht.

Ich hatte vor kurzem mit einem ähnlichen Problem zu kämpfen. Das Problem war das Ergebnis des Kontexts, der einen Verweis auf das Objekt, das ich (offensichtlich) verwendete, beibehielt. Jedes Mal, wenn ich ein Objekt desselben Typs änderte, auch wenn es mit einem neuen Kontext erstellt wurde (so dachte ich), wurde das Objekt geändert.

Mit Hilfe eines meiner Kollegen haben wir festgestellt, dass der Kontext aufgrund der Art und Weise, in der ich ihn mit meinem IoC-Container registrieren wollte (Lifestyle per Web-Anfrage), herumlag. Als ich den Lebensstil in transient änderte (was definitiv eine neue Instanz zur Verfügung stellte), wurden Änderungen an Objekten desselben Typs nicht beeinflusst.

Hoffe, das hilft.

+0

LOL ... Mann ... wusste nicht, dass Sie diese Frage vor 2 Jahren gestellt haben!Ich bin mir sicher, dass Sie dieses Problem inzwischen gelöst haben =) Hoffentlich hilft die Antwort jemand anderem. – Rich

+0

Danke Reich. Ich werde es definitiv ausprobieren. Ich denke, am Ende blieb ich bei der "Lösung", die in der Frage erwähnt wurde, aber das könnte mir sehr gut etwas Neues beibringen. : D – Johannes