c# - 删除抛出 "deleted object would be re-saved by cascade"

标签 c# nhibernate nhibernate-mapping cascade

我有以下模型:

<class name="Person" table="Person" optimistic-lock="version">
  <id name="Id" type="Int32" unsaved-value="0">
    <generator class="native" />
  </id>
  <!-- plus some properties here -->
</class>

<class name="Event" table="Event" optimistic-lock="version">
  <id name="Id" type="Int32" unsaved-value="0">
    <generator class="native" />
  </id>
  <!-- plus some properties here -->
</class>

<class name="PersonEventRegistration" table="PersonEventRegistration" optimistic-lock="version">
  <id name="Id" type="Int32" unsaved-value="0">
    <generator class="native" />
  </id>
  <property name="IsComplete" type="Boolean" not-null="true" />
  <property name="RegistrationDate" type="DateTime" not-null="true" />
  <many-to-one name="Person" class="Person" column="PersonId" foreign-key="FK_PersonEvent_PersonId" cascade="all-delete-orphan" />
  <many-to-one name="Event" class="Event" column="EventId" foreign-key="FK_PersonEvent_EventId" cascade="all-delete-orphan" />
</class>

在 Person 和 Event 中都没有指向 PersonEventRegistration 的属性。

当我尝试从 PersonEventRegistration 中删除条目时,出现以下错误:

"deleted object would be re-saved by cascade"

问题是,我没有将此对象存储在任何其他集合中 - 删除代码如下所示:

public bool UnregisterFromEvent(Person person, Event entry)
{
    var registrationEntry = this.session
        .CreateCriteria<PersonEventRegistration>()
        .Add(Restrictions.Eq("Person", person))
        .Add(Restrictions.Eq("Event", entry))
        .Add(Restrictions.Eq("IsComplete", false))
        .UniqueResult<PersonEventRegistration>();

    bool result = false;
    if (null != registrationEntry)
    {
        using (ITransaction tx = this.session.BeginTransaction())
        {
            this.session.Delete(registrationEntry);
            tx.Commit();
            result = true;
        }
    }
    return result;
}

我在这里做错了什么?

最佳答案

据我所知,cascade="all-delete-orphan" 属于集合映射元素,而不是多对一。您没有显示映射的其他两个部分,所以我不能肯定地说,但这可能(可能)是问题。

我认为 Person 应该是这样的:

<!-- other properties -->
<set name="Events" inverse="true" cascade="all-delete-orphan">
    <key column="Person_id" />
    <one-to-many class="PersonEventRegistration" />
</set>

事件:

<!-- similar mapping for Event -->

PersonEventRegistration:

<!-- other properties -->
<many-to-one name="Person" class="Person" column="PersonId" foreign-key="FK_PersonEvent_PersonId" cascade="delete" <!-- or many ="all" ? --> />

实际上,以上可能是相互冲突的级联(这可能是您所拥有的)。所以真的,我的答案是两件事:

  1. cascade="all-delete-orphan"many-to-one 没有意义。
  2. 确保您已经认真考虑过如何与您的实体合作以及它们应该如何级联它们的操作。

关于c# - 删除抛出 "deleted object would be re-saved by cascade",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/931129/

相关文章:

c# - hibernate 。在同一 session 中创建后包为空

c# - 尝试使用 C# ftpwebrequest 将 xml 文件 ftp 到 Zebra 打印机时出错

c# - 检查是否有任何文本框有数据然后做一些事情

c# - 使用延迟加载的 NHibernate ObjectProxy 转换

c# - NHibernate Query to json 结果出乎意料

nhibernate - 如何使用 fluentNHibernate 映射 NHibernate 自定义集合?

c# - 为什么我的自托管 WCF 服务返回 403 Forbidden,而不是 401 Unauthorized?

c# - 你如何检查 DateTime 是否已初始化?

c# - NHibernate.查询异常 : duplicate association path

c# - 使用 CaSTLe ActiveRecord,当两个类具有相同名称但命名空间不同时,我得到一个 NHibernate DuplicateMappingException