2010-11-19 6 views
0

Ich habe ein Problem beim Zuordnen einer Viele-zu-Eins-Beziehung von einer abstrakten Basisklassenzuordnung zu einer konkreten Union-Unterklasse. Beispiel:Zuordnen von NHibernate-n: 1-Beziehungen von abstrakten Basisklassen zu union-subclasses

public abstract class Entity 
{ 
    public virtual Guid ID {get; set;} 
    public virtual string Name {get;set;} 
    public virtual User OwnerUser {get; set;} 
} 

public class User : Entity 
{ 
    public virtual string UserName {get; set;} 
} 

Wie Sie hier sehen können, habe ich eine Basis abstrakte Klasse für alle meine Datenbankobjekte. Ich ordne diese Klassen mit der Entity-Klasse als abstrakte Mapping-Klasse und dem Benutzer als Union-Subclass ab. Beim Erstellen des Konfigurationsobjekts werden keine Fehler ausgegeben und das Schema kann problemlos exportiert werden. Das Feld OwnerUser wird jedoch nicht in der Datenbank für alle konkreten Klassen angezeigt. Hier ist ein Beispiel dafür, wie das Mapping aussieht:

Ich verwende auch eine Oracle XE-Instanz als Datenbank-Backend. Wenn das nicht genug Informationen sind, um die Frage richtig zu beantworten, lass es mich wissen und ich werde hinzufügen, was ich kann.

Worst-Case-Szenario Ich werde nur die Viele-zu-Eins-Beziehung explizit auf alle konkreten Objekte hinzufügen, aber dies ist nicht die eleganteste Lösung und ich denke, was ich vorgeschlagen habe, sollte funktionieren. Ich konnte keine konkreten Beispiele dafür auf den Röhren finden, die die verschiedenen Netze antreiben, noch habe ich irgendetwas in der Dokumentation gefunden, das ausdrücklich darauf hinweist, dass dies ein ungültiger Anwendungsfall ist, obwohl ich etwas verpasst haben könnte. Es wäre nicht das erste Mal gewesen: -/

Alle Antworten auf diese Frage werden sehr geschätzt. Vielen Dank für Ihre Zeit.

Antwort

0

Wow, nur ... wow.

Anstatt zu versuchen, diesen Beitrag zu löschen, werde ich es für einen anderen niedrigen nhibernate noob verlassen, um einen Tag zu finden, da ich keine Fragen zu diesem speziellen Anwendungsfall finden konnte.

Tatsache ist, dass Sie dies ohne Probleme tun können. Mein Problem war, dass ich ID für das Spaltenattribut in dem Viele-zu-eins-Mapping-Element angegeben habe. Aus irgendeinem seltsamen Grund dachte ich, dass das die Spalte war, auf die der Fremdschlüssel Bezug nahm (was eigentlich die Eigentumsreferenz ist, wenn ich mich nicht irre). Dieses Attribut gibt den Spaltennamen in der Tabelle an, die die Referenz enthält (d'oh!). Überraschenderweise wird NHibernate mehrere Mapping-Elemente ohne Warnung dem gleichen Spaltennamen zuordnen. Ich versuche nicht, sie zu beschuldigen, vielleicht erlaubt der Anwendungsfall dafür eine Art Überschreibung einer polymorphen abgeleiteten Klasse.

Wie auch immer, dies ist ein gültiger Anwendungsfall und das Ändern des Spaltenattributs auf den Namen der Spalte in der verweisenden Tabelle hat gut funktioniert. Vielleicht habe ich diese Woche jede Nacht ein bisschen zu lange nach Bits und Bytes geschaut ... Seufzer.

Vielen Dank an alle, die sich die Zeit genommen haben, diesen Beitrag zu lesen.

Verwandte Themen