2012-04-11 3 views
0

Ich versuche, NHibernate zu verwenden, um eine mäßig komplexe Objektgraphen zu serialisiert *NHibernate ignorieren GeneratedBy.Identity()

tatsächliche Zuordnung über FNH fertig war, aber ich habe die HBM-Dateien abgeladen und bestätigt, dass die erzeugte XML entspricht den NHibernate-Konventionen.

Hier ist ein Ausschnitt aus der HBM, nur für grins:

<class xmlns="urn:nhibernate-mapping-2.2" schema="obsv" optimistic-lock="version" name="Spc.Ofp.Tubs.DAL.Entities.PurseSeineActivity, TubsDAL, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="s_daylog"> 
<id name="Id" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
    <column name="s_daylog_id" not-null="true" /> 
    <generator class="identity" /> 
</id> 

Diese Zuordnung ergibt folgende SQL (via SQL Debug, zur besseren Lesbarkeit snipped):

INSERT INTO obsv.s_daylog (/* columns 0 thru 20 snipped */s_daylog_id /* <-- PK from mapping! */) 
VALUES (/* parameters snipped */@p21); 
select SCOPE_IDENTITY();@p21 = NULL [Type: Int32 (0)] 

I glauben dass das Vorhandensein der "select SCOPE_IDENTITY();" Text bestätigt, dass NHibernate teilweise versteht, was passieren soll. Ich verstehe einfach nicht, warum es die PK-Spalte in die Einfügeabfrage schreibt.

Ich habe die Mappings zum Lesen der Grafik verwendet, also bin ich mir ziemlich sicher, dass dies kein grundlegendes Mapping-Problem ist.

FWIW, Cascade wird auf None gesetzt (aus anderen Gründen muss ich mit diesen Elementen arbeiten, ohne Verzweigungen auf dem Objektdiagramm).

* Mit mäßig komplex, ich meine ich habe ein Objekt, das zwischen 6 und 10 Eigenschaften hat, die Listen von Kind-Entitäten sind. Eine gute Anzahl dieser untergeordneten Entitäten hat auch untergeordnete Entitäten. Im komplexesten Fall gibt es 5 Generationen von Entitäten unter der Root-Entität.

+0

Als schnelles Follow-up, das kann ich hacken arbeiten, indem Sie explizit eine SQL-INSERT-Anweisung einstellen, die nicht die PK Spalte enthält. –

+0

Zweite Nachverfolgung: Jetzt versucht NHibernate, die Identitätsspalte bei der Aktualisierung zu aktualisieren. FML! –

+0

Es sieht für mich so aus, als ob NHibernate weiß, dass es ein Schlüssel ist, mit einem Identitätsgenerator, wie du sagst. Ihre SQL zeigt jedoch, dass versucht wird, "NULL" als ID einzufügen. Lassen Sie uns das Schema für diese Tabelle (für die entsprechenden Spalten) und die zugeordnete Klasse sehen. – dwerner

Antwort

0

Ich denke, es ist, weil Ihre Zuordnung scheint nicht korrekt.

Gemäß the NHibernate Reference hat das ID-Tag ein "column" -Attribut, um den Spaltennamen festzulegen, kein untergeordnetes Element.

+0

Ja. Ich habe etwas Krähe zu essen. Diese Entität hatte eine untergeordnete Entität und ich ordnete sie mithilfe der FNH-Methode "Referenzen" anstelle von "HasOne". –

0

Versuchen dynamic-insert="true" mit:

<class xmlns="urn:nhibernate-mapping-2.2" dynamic-insert="true" schema="obsv" optimistic-lock="version" name="Spc.Ofp.Tubs.DAL.Entities.PurseSeineActivity, TubsDAL, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="s_daylog"> 
Verwandte Themen