Frage

Mit Castle Activerecord, ich in ein Problem gestolpert, als faul-Laden.

Die folgenden Werke (offensichtlich)

using (new SessionScope())
{
    User singleUser = User.FindFirst(...)
    UserGroup groups = singleUser.Groups; // Lazy-loading groups.
}

Da ich die Session-Filter in einem bestimmten Kontext ändern muß (mit Abfangjäger), erstelle ich eine neue SessionScope.

using (new SessionScope())
{
    User singleUser;
    EnableVariousFiltersInThisThread();
    using (new SessionScope())
    {
        singleUser = User.FindFirst(...);
    }
    DisableVariousFiltersInThisThread();
    UserGroup groups = singleUser.Groups; // Lazy-loading groups.
}

Die letzte Zeile „singleUser.Groups“ wirft einen LazyInitializationException: „failed eine Sammlung von Rolle zu faul initialisieren: Gruppen, keine Sitzung oder eine Sitzung wurde geschlossen“.

Aber auch alle anderen Sitzung Operationen korrekt funktionieren. So scheint es, dass „Einzelplatz“ an den jetzt angeordneten SessionScope gebunden ist. Warum? Und wie kann diese alternativ gelöst werden?

War es hilfreich?

Lösung

Mein GUESS ist - ein Teil des Grundes ist über "Identity Map". Nicht nur faul geladene Objekte, sondern auch alle Objekte zu einer Sitzung gebunden. Dies stellt sicher, dass keine zwei Objekte eine einzelne Zeile in der Datenbank darstellen.

Andere Tipps

Ich glaube, dies ist die Art und Weise NHibernate funktioniert.

Ihre Einheiten sind alle mit einer Sitzung und nutzen diese für verzögertes Laden verbunden sind. Wenn Sie Ihre Sitzung verfügen, können Sie nicht faul geladene Sammlungen und Eigenschaften holen. Die Antwort, offensichtlich unter Berücksichtigung dieser Einschränkung ist das Anordnen der Sitzung zu vermeiden -. Oder die Sitzung am Leben zu halten, bis Sie die Daten extrahiert haben Sie benötigen

Der innere Umfang unterscheidet sich nicht von der Außen; es nicht verzögertes Laden außerhalb dieses Umfangs unterstützt auch nicht.

Sie können jedoch diese Einschränkung umgehen, wenn Sie NHibernate in eifrig Laden in Ihrem inneren Umfang Trick. Alternativ rufen .ToList() oder ähnlich zu den Sammlungen, die Sie wollen würden, mit arbeiten, bevor Sie den Rahmen verlassen und die Daten werden auch außerhalb zur Verfügung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top