首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Delete抛出“Delete object would by cascade”

Delete抛出“Delete object would by cascade”
EN

Stack Overflow用户
提问于 2009-05-31 02:34:55
回答 2查看 9.4K关注 0票数 6

我有以下模型:

代码语言:javascript
复制
<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中删除一个条目时,我得到了以下错误:

代码语言:javascript
复制
"deleted object would be re-saved by cascade"

问题是,我没有将这个对象存储在任何其他集合中-删除代码看起来像这样:

代码语言:javascript
复制
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;
}

我在这里做错了什么?

EN

回答 2

Stack Overflow用户

发布于 2009-06-01 14:05:05

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

我认为Person应该看起来像这样:

代码语言:javascript
复制
<!-- other properties -->
<set name="Events" inverse="true" cascade="all-delete-orphan">
    <key column="Person_id" />
    <one-to-many class="PersonEventRegistration" />
</set>

Event

代码语言:javascript
复制
<!-- similar mapping for Event -->

PersonEventRegistration

代码语言:javascript
复制
<!-- 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. Make上没有任何意义确信你已经真正考虑过如何处理你的实体以及他们应该如何级联他们的操作。
票数 3
EN

Stack Overflow用户

发布于 2010-02-21 22:19:09

尝试在删除操作中取消引用人员和事件:

代码语言:javascript
复制
    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())
            {
                registrationEntry.Person = null;
                registrationEntry.Event = null;
                this.session.Delete(registrationEntry);
                tx.Commit();
                result = true;
            }
        }
        return result;
    }

另外,我没有意识到你可以添加对对象的限制,我会使用别名和I来写这篇文章。

代码语言:javascript
复制
            .Add(Restrictions.Eq("Person", person))
            .Add(Restrictions.Eq("Event", entry))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/931129

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档