Fließende NHibernate-Eins-zu-Viele-Zuordnung

8

Ich habe die folgenden 2 Klassen:

Anzeige

%Vor%

Anzeigenbild

%Vor%

In der DB hat meine AdvertImages-Tabelle die FK "AdvertId", die sich auf die Adverts-Tabelle bezieht, die den PK von "Id" hat.

Dies ist eine Eins-zu-Viele-Zuordnung, bei der eine Anzeige viele Bilder enthalten kann.

Meine fließenden NHibernate-Zuordnungen (kurz bearbeitet) sind:

Anzeigen-Map

%Vor%

AdvertImageMap

%Vor%

Ich erstelle eine neue Instanz von Advert im Code und fülle dann die AdvertImages -Eigenschaft (der Anzeige) mit List<AdvertImage> .

Wenn ich mein Advert -Objekt in der DB persistiere, möchte ich, dass die AdvertImages in ihre AdvertImages-Tabelle eingefügt werden, aber aufgrund der Beziehung zwischen den 2 Tabellen muss ich zuerst die Advert-Einfügung vornehmen da die PK-ID generiert wird, die dann in die AdvertImages-Tabelle eingefügt werden kann. (Wenn ich meine Liste von AdvertImage erstelle, beziehe ich die Dateiname-Eigenschaft, aber habe offensichtlich zu diesem Zeitpunkt noch nicht die neue AdverId, möchte also, dass die Datei gefüllt wird, wenn die Anzeige in der DB beibehalten wird.)

Ich habe versucht, mit verschiedenen Einstellungen für Inverse () und Cascade zu experimentieren, aber es ist noch nicht gelungen. Kann mir bitte jemand helfen?

    
marcusstarnes 01.06.2012, 16:12
quelle

3 Antworten

10

Sie müssen Ihr Advert Mapping in cascade ändern:

%Vor%

Sie sollten dann in der Lage sein, etwas wie das Objekt Advert und seine Kinder AdvertImage zu erhalten.

%Vor%

Meine Entitäten enthalten normalerweise Add- und Remove-Methoden für bidirektionale Beziehungen von eins zu viele wie folgt:

%Vor%     
Cole W 01.06.2012, 18:19
quelle
2

Ich hatte das gleiche Problem. Ich habe einige Zeit damit verbracht, alle Arten von Mappings auszuprobieren. Ich entdeckte dann, dass meine Zuordnungen in Ordnung waren, und es war tatsächlich, dass ich meine Sitzung in eine Transaktion einbinden musste und die Methode Commit () nach der Methode session.SaveOrUpdate () verwenden musste.

%Vor%     
Arnold.Krumins 21.01.2014 14:36
quelle
1

Was für mich normalerweise funktioniert, ist, die Fremdschlüsselspalte so zu setzen, dass Nullen in DB erlaubt sind - das wäre Ihre AdvertId-Spalte, aber ich bin mir nicht sicher, ob das in Ihrem Fall funktionieren würde, da Sie Identität verwenden. Was NHibernate tut, ist INSERT all mit einer Abfrage und aktualisiert dann die untergeordnete Tabellenspalte für Fremdschlüssel in die korrekte ID der übergeordneten Tabelle. Vielleicht würde es auch in deinem Fall funktionieren.

Hier ist eine ähnliche Frage, die helfen könnte: Cascade insert on Eins zu viele mit fließendem NHibernate

    
Miroslav Popovic 01.06.2012 16:52
quelle