我有以下模型:
<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;
}我在这里做错了什么?
发布于 2009-06-01 14:05:05
据我所知,cascade="all-delete-orphan"属于集合映射元素,而不是many-to-one。您还没有显示映射的其他两个部分,所以我不能肯定,但这可能(很可能)是问题所在。
我认为Person应该看起来像这样:
<!-- other properties -->
<set name="Events" inverse="true" cascade="all-delete-orphan">
<key column="Person_id" />
<one-to-many class="PersonEventRegistration" />
</set>Event
<!-- 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" ? --> />实际上,以上可能是相互冲突的级联(这可能就是您所拥有的)。所以真的,我的答案是两件事:
cascade="all-delete-orphan"在many-to-one.发布于 2010-02-21 22:19:09
尝试在删除操作中取消引用人员和事件:
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来写这篇文章。
.Add(Restrictions.Eq("Person", person))
.Add(Restrictions.Eq("Event", entry))https://stackoverflow.com/questions/931129
复制相似问题