【问题标题】:NHibernate.Engine.ForeignKeys - Unable to determine if entity is transient or detachedNHibernate.Engine.ForeignKeys - 无法确定实体是暂时的还是分离的
【发布时间】:2012-12-28 15:54:25
【问题描述】:

我有这个仪器实体:

<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" />

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

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

我在日志中收到错误:

2012-12-20 14:09:54,607 警告 12 NHibernate.Engine.ForeignKeys - 无法 确定仪器是否已分配 标识符 11457 是暂时的或分离的;查询数据库。利用 在会话中显式 Save() 或 Update() 以防止这种情况发生。

关于 Instrument 实体的一些事实:

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

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

编辑1:因为问题(版本1)还没有回答,让我稍微修改一下:

问题(第 2 版):NHibernate 仍在尝试确定实体是否分离/瞬态的行为可能是什么?我认为我的映射配置正确(unsaved-valuegenerator)。

【问题讨论】:

    标签: nhibernate


    【解决方案1】:

    问题是当你保存 InstrumentSelection 时,NHibernate 会级联操作来保存子 Instruments。我的第一个建议是在关系的 InstrumentSelect 端将 cascade 设置为 none。

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

    【讨论】:

    • 我已经使用拦截器创建了一个解决方法(完全相同的解决方案) - 工作正常。我也尝试过级联选项 - 徒劳。我仍然面临这个问题。无论如何,也许我会改写我的问题。请查看更新后的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-13
    相关资源
    最近更新 更多