none
Entity-Framework Zugriff auf den ObjectContext aus EntityObject ist nicht möglich RRS feed

  • Frage

  • Hallo EF-Experten,

    ich hatte eigentlich gedacht, es ist ganz einfach innerhalb eines EntityObject auf dessen aktuellen EntityContext zuzugreifen.
    Leider habe ich keinen public Wege gefunden.

    Der RelationshipManager jedes Entities hat genau das gewünschte Context-Property, aber das ist internal, warum?????????

    Ich möchte aus einem EntityObject heraus (innerhalb einer Methode in dieser Klasse) eine Query auf den aktuellen ObjectContext absetzen und keinen neuen bauen müssen, zumal das Ergebnis dann in dem neuen ObjectContext und nicht in meinem aktuellen steht und ich auch ggf. bereits geänderte Attribute nicht berücksichtigen kann etc.

    Das ObjectStateManager ObjectStateManagerChanged Event funktioniert auch nur für "attached" gelesene Objekte, leider, darüber könnte man den Context abgreifen...

    Habe ich da was am EF-Konzept übersehen.??? Ganz bestimmt, hoffe ich.


    Vielen Dank
    Mittwoch, 30. September 2009 12:36

Antworten

  • Hallo Roman,

    der RelationShipManager ist internal, um Dich vor Ungemach zu schützen ;-)
    Denn der ObjectContext dort ist nicht serialisierbar und auch nur für gebundene Objekte gültig.

    Grundsätzlich sollte ein EntityObjekt niemals den Zugriff selbst durchführen, denn dazu
    müsste es wiederum über den Zustand des ObjectContextes informiert sein, bzw. diesen
    herstellen können.
    Und über mehere Entitäten hinweg, kommst Du schnell in Teufels Küche, wenn Du
    abhängige Objekte speichern willst, Transaktionen verwenden uam.

    Deswegen gehört der Datenzugriff über eine eigene Klasse gemanagt,
    die den Zugriff auf den ObjectContext verwaltet und die Integrität sicherstellt,
    in dem sie Verbindungen geordnet auf-/abbaut usw. -> Unit Of Work.

    Zumal spätestens, wenn Du POCO verwenden willst, was im EF bei NET 4.0 hinzukommt,
    klappt das mit dem quer durch das Objekt hindurch gar nicht mehr.

    Gruß Elmar

    Mittwoch, 30. September 2009 21:50
    Beantworter

Alle Antworten

  • Hallo Roman,

    der RelationShipManager ist internal, um Dich vor Ungemach zu schützen ;-)
    Denn der ObjectContext dort ist nicht serialisierbar und auch nur für gebundene Objekte gültig.

    Grundsätzlich sollte ein EntityObjekt niemals den Zugriff selbst durchführen, denn dazu
    müsste es wiederum über den Zustand des ObjectContextes informiert sein, bzw. diesen
    herstellen können.
    Und über mehere Entitäten hinweg, kommst Du schnell in Teufels Küche, wenn Du
    abhängige Objekte speichern willst, Transaktionen verwenden uam.

    Deswegen gehört der Datenzugriff über eine eigene Klasse gemanagt,
    die den Zugriff auf den ObjectContext verwaltet und die Integrität sicherstellt,
    in dem sie Verbindungen geordnet auf-/abbaut usw. -> Unit Of Work.

    Zumal spätestens, wenn Du POCO verwenden willst, was im EF bei NET 4.0 hinzukommt,
    klappt das mit dem quer durch das Objekt hindurch gar nicht mehr.

    Gruß Elmar

    Mittwoch, 30. September 2009 21:50
    Beantworter
  • Hallo Elmar,

    vielen Dank für die Antwort,

    Ich bin auch für die Trennung von "Logik" und "Daten", aber für ganz einfache Dinge, wie das Ausrechnen von Werten über eine Query, für die man keine Association haben kann, wäre es schick, wenn das Object seinen ObjectContext zugreifbar hätte...

    Wir werden weitestgehend entscheiden, ob wir das Design an den Stellen überarbeiten.

    Hier ist noch ein Tipp, wie es doch geht...
    http://blogs.msdn.com/alexj/archive/2009/06/08/tip-24-how-to-get-the-objectcontext-from-an-entity.aspx


    Roman
    Donnerstag, 1. Oktober 2009 06:41
  • Hallo Roman,

    dort steht auch deutlich, dass sie es nicht empfehlen.

    Auch "ganz einfache Dinge" sollten so gleich wie die vermeintlich komplizierten behandelt werden.
    Zumal das Ausrechnen von Werten, wenn sie über eine andere Entität erfolgen, in der Regel eine
    komplexere Abfrage bedeuten (z. B. Aggregation - SUM, etc.).
    Und man sich später (mit steigenden Datenmengen) wundert, wieso das alles so langsam wird.
    Wenn man darauf diese Stellen verbessern möchte, wird es wiederum aufwändig sie zu finden
    und auf einen gemeinsamen Nenner zu bringen.

    Deswegen mein Rat: Gleich beim Design richtig machen.

    Gruß Elmar

    Donnerstag, 1. Oktober 2009 07:58
    Beantworter
  • Hallo Roman csharp,

    Haben Dir die Antworten geholfen?

    Grüße,
    Robert

    Dienstag, 13. Oktober 2009 11:20
    Moderator
  • Hallo Robert,

    wie Du am thread sehen kannst, ja!!



    Roman
    Dienstag, 13. Oktober 2009 18:45