【发布时间】:2012-04-12 19:51:52
【问题描述】:
我正在尝试使用 NHibernate 序列化一个中等复杂的对象图*
实际映射是通过 FNH 完成的,但我已转储 HBM 文件并确认生成的 XML 符合 NHibernate 约定。
这是 HBM 的 sn-p,仅供参考:
<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 代实体。
【问题讨论】:
-
作为快速跟进,我可以通过显式设置不包含 PK 列的 sql-insert 语句来破解它。
-
第二次跟进:现在 NHibernate 正在尝试在更新时更新标识列。 FML!
-
在我看来,NHibernate 知道它是一把钥匙,正如你所说的,它带有一个身份生成器。但是,您的 SQL 确实表明它正在尝试插入
NULL作为 Id。让我们看看这个表的架构(对于适当的列)和映射的类。 -
您的映射中是否还为
s_daylog_id定义了一个属性?
标签: nhibernate fluent-nhibernate