2012-04-11 8 views
0
私は

NHibernateはGeneratedBy.Identityを()無視し

実際のマッピングはFNHを介して行われました*適度に複雑なオブジェクトグラフをシリアル化するためにNHibernateはを使用しようとするんだけど、私はHBMファイルをダンプし、生成されたXMLがいることが確認されました

NHibernateの規約に準拠しています。

ここでちょうどにやにや笑いのために、HBMの抜粋です:

<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> 

次のSQL(SQLのデバッグを経由して、読みやすくするために切り取ら)このマッピングの結果:

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)] 

私はを信じ"select SCOPE_IDENTITY();"の存在が、テキストは、 NHibernateが何が起こるべきかを部分的に理解していることを確認します。私はちょうどそれが挿入クエリにPK列を書いている理由を理解していません。

グラフを読み込むためのマッピングを使っていますので、これは基本的なマッピングの問題ではありません。

FWIWでは、カスケードは[なし]に設定されています(他の理由から、 のオブジェクトグラフを使用しないでこれらのエンティティを操作する必要があります)。

*中程度に複雑なものは、子エンティティのリストである6〜10のプロパティを持つオブジェクトがあることを意味します。それらの子エンティティの数には、子エンティティもあります。最も複雑なケースでは、ルートエンティティの下に5世代のエンティティが存在します。

+0

迅速なフォローアップとして、私は明示的にPK列が含まれていないSQL-insert文を設定することで、作業にこれをハックすることができます。 –

+0

2回目のフォローアップ:NHibernateは、アップデート時にIDカラムを更新しようとしています。 FML! –

+0

NHibernateは、あなたが言うように、IDジェネレータを使って、それが鍵であることを知っているように見えます。しかし、あなたのSQLはIDとして 'NULL'を挿入しようとしていることを示しています。 この表のスキーマ(該当する列の場合)とマップされたクラスを見てみましょう。 – dwerner

答えて

0

あなたのマッピングが正しくないようだと思います。

the NHibernate Referenceによれば、idタグには、子要素ではなく列名を設定する「列」属性があります。

+0

私はいくつかのカラスを食べる。このエンティティに子エンティティがあり、 "HasOne"の代わりにFNHの "References"メソッドを使用してマッピングしていました。 –

0

dynamic-insert="true"を使用してみてください:

<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"> 
関連する問題