NHibernate.Engine.ForeignKeys - 无法确定实体是瞬态还是分离

时间:2012-12-20 13:19:29

标签: nhibernate

我有工具实体:

<class name="Instrument" table="Instruments" mutable="false">
    <id name="ID" column="INSTRUMENT_ID" unsaved-value="0">
        <generator class="assigned" />
    </id>
    <property name="....." />
    <property name="....." />
</class>

此实体在其他实体( InstrumentSelection )中以多对一关系使用。这是多对一的映射信息:

<many-to-one name="Instrument" access="field.camelcase" column="Instrument_ID" update="false" class="Instrument" not-null="true" fetch="join" lazy="false" />

当我用保存保存 InstrumentSelection 实体时,我遇到了这个问题:

Transact(() => session.Save(entity));

我在日志中遇到错误:

  

2012-12-20 14:09:54,607 WARN 12 NHibernate.Engine.ForeignKeys - Unable   确定仪器是否已分配   标识符11457是暂时的或分离的;查询数据库。使用   在会话中显式保存()或更新()以防止这种情况。

关于工具实体的一些事实:

  • 它只是一个参考实体
  • 这是不可变的实体
  • 无法通过应用程序添加/插入。我从外部Feed获取数据库中的行。

问题(版本1):我的问题是:有没有办法指示NHibernate始终将Instrument实体视为已分离?我的意思是 - 如果应用程序中存在一个Instrument实例,则意味着它存在于数据库中。所以在查询数据库时没有多大意义。

编辑1:因为问题(版本1)尚未回答,请允许我稍微更改一下:

问题(版本2):NHibernate仍然试图弄清楚实体是否是分离/瞬态的行为是什么?我想我的映射配置正确(未保存值生成器)。

1 个答案:

答案 0 :(得分:2)

问题在于,当您保存InstrumentSelection时,NHibernate正在级联操作以保存子Instruments。我的第一个建议是在关系的InstrumentSelect一侧将级联设置为none。

我的第二个建议是使用this answer中所示的拦截器。