0

NHibernate を使用して、適度に複雑なオブジェクト グラフをシリアル化しようとしています *

実際のマッピングは FNH 経由で行われましたが、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、Cascade は None に設定されています (他の理由で、オブジェクト グラフの上下に影響を与えずにこれらのエンティティを操作する必要があります)。

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

4

2 に答える 2

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">
于 2012-04-12T11:51:52.293 に答える
0

あなたのマッピングが間違っているように見えるからだと思います。

NHibernate Referenceによると、id タグには、子要素ではなく、列名を設定するための「column」属性があります。

于 2012-04-12T01:59:17.147 に答える