2017-01-23 1 views
2

Nehmen wir an, ich habe die Tabelle "Zellen", Tabelle "Divisionen" und die Verknüpfungstabelle zwischen ihnen. Darüber hinaus kann ich Tabelle "Zellen" nicht zuordnen, weil ich "CellsView" habe, die ich zuordnen muss (es kann Zellen abhängig von aktuellen Benutzerberechtigungen anzeigen)Fluent NHibernate - Entity nicht zurückgeben, wenn eine seiner Abhängigkeiten nicht existiert

Weiter .. kann es eine Situation geben, wenn Division ist Zugewiesen an eine Zelle, aber der aktuelle Benutzer wird diese Zelle nicht sehen, wenn er sie auflisten möchte. Beim Abrufen der Liste der Divisionen erhält unser Benutzer eine Ausnahme, die besagt, dass die Zelle mit der ID "1" nicht erwartet wird. (ID ist korrekt und Zelle existiert, aber unsere Ansicht erlaubt es nicht, diese Zelle anzuzeigen)

Wie kann ich verhindern, dass die Divisionsliste eine Ausnahme auslöst (Lazy Loading ist aktiviert) ** und von der Division, die diese Ausnahme auslösen würde * *?

Ich habe versucht, aktuelle Entität auf OnPreLoad -Ereignis und OnPostLoad -Ereignis Null, wenn meine Cell-Entität kann nicht aufgelöst werden, aber es funktioniert nicht. Alle Divisions-Entities werden zurückgegeben und versuchen beim Lesen fließend zu versuchen, Cell aufzulösen und Exception auszulösen.

Dass CellsView-Verbindung an vielen Stellen innerhalb der Anwendung verwendet wird, wäre eine generische Lösung wie diese mit PostLoad-Ereignissen großartig, um damit global umzugehen.

Antwort

1

Ich verwende nicht Fluent, aber wenn es Duplikate what .hbm.xml mappings can do, sollten Sie in der Lage sein, einen Filter für Ihre Sammlung zu definieren und anzuwenden. Dies sollte Ihnen erlauben, mit Ihrem Fall umzugehen.

Filter können einige parametrisierte Einschränkungen für die Elemente einer Entitätssammlung definieren. Sie können Filter nach dem Öffnen der Sitzung parametrisieren und aktivieren, wo Sie wissen sollten, wer Ihr Benutzer ist.

In der Tat können Filter außerhalb von Zuordnungen definiert werden. Selbst wenn Fluent diese nicht behandelt, sollten Sie sie dennoch verwenden können.

Beispiel von Nhibernate reference documentation:

ICollection<Cat> blackKittens = session.CreateFilter(
    pk.Kittens, "where this.Color = ?", Color.Black, NHibernateUtil.Enum(typeof(Color)) 
).List<Cat>(); 

Mehr Details nach Kommentare:

Filter sollten auch Untereinheiten navigieren können. Da Ihr Fall jedoch ein wenig bösartig ist (Fremdschlüssel ist definiert, aber fremde Entität wird nicht gefunden), sollten Sie eine nicht Nullable-Eigenschaft Ihrer Unterentität testen, aber nicht ihren Primärschlüssel. (Sonst NHibenate wird es sehr wahrscheinlich durch einen Test auf Elternfremdschlüssel vereinfachen.)

"where this.Cell.SomeNonNullableProperty is not null" 

Dies zu SQL übersetzt werden würde und sollte ohne Ausnahmen ausgeführt werden und würde Ihr nicht einsehbaren Divisionen herauszufiltern.

Übrigens, Filter möglicherweise nicht die Antwort für Sie, wenn alles, was Sie tun, um Division Listen zu erhalten, sie explizit abfragt. (Sie werden nicht durch einige Über-Entitäten geleitet, die auf sie als Sammlung verweisen.) Verwenden Sie in diesem Fall einfach die obige Bedingung direkt in Ihren Abfragen.

Um nur die Ausnahme zu adressieren, können Sie auch Ihr Mapping mit der not-found="ignore|exception" Option von many-to-one Beziehungen basteln. Aber ich bin mir nicht sicher, ob es gut mit Lazy-Loading funktioniert, ich habe es nie ausprobiert. (Und ich weiß nicht, ob diese Option fließend verfügbar ist.)

+0

Filter Idee scheint nett zu sein, aber ich möchte nicht auf bestimmten Wert (zum Beispiel schwarze Katze) filtern, aber wenn Subentität sogar existiert (Katze hat Typ "männlich") Ich möchte prüfen, ob dieser Typ richtig ist geladen oder nicht ganze Katze zurückgeben, wenn der Typ einen Fehler anzeigt. (Ich möchte IsInitialized verwenden). Denkst du, dass es möglich ist? –

+0

Ich habe weitere Details hinzugefügt. –

Verwandte Themen