NHibernate忽略GeneratedBy.Identity()

时间:2012-04-11 23:05:57

标签: nhibernate fluent-nhibernate

我正在尝试使用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代实体。

2 个答案:

答案 0 :(得分:0)

我认为这是因为您的映射似乎不正确。

根据the NHibernate Reference,id标签有一个“column”属性来设置列名,而不是子元素。

答案 1 :(得分: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">