【问题标题】:NHibernate ignoring GeneratedBy.Identity()NHibernate 忽略 GeneratedBy.Identity()
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • 是的。我有一些乌鸦要吃。这个实体有一个子实体,我使用 FNH 的“References”方法而不是“HasOne”来映射它。
【解决方案2】:

尝试使用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">

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多