NHibernate Deleted对象将通过级联重新保存

Gat*_*aka 5 c# nhibernate

在我的解决方案中,我有一个带关联的业务对象分支.因此,当我尝试在处理后保存根对象时,我得到一个异常,并显示消息"已删除的对象将通过级联重新保存".这意味着删除一个对象后它仍然存在于集合中,其他关联等等.有人知道如何获取已删除对象的引用列表.没有调试器支持很难找到引用.

Rad*_*ler 6

最常见的场景(我的经验)是有两个根对象具有一些配对/中间对象的集合.

public class Employee 
{
    public virtual IList<Occupation> Occupations { get; set; }
}
public class Company
{
    public virtual IList<Occupation> Occupations { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

现在,我们有Occupation这样的

public class Occupation
{
    public virtual Employee Employee { get; set; }
    public virtual Company  Company  { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

那么,会发生什么:

  1. 我们从集合中删除了一个职业employee.Occupations.
  2. 在那次交易,工作单位,我们也因此加载 Company
  3. 公司成立了.它的职业集合被加载.所以删除职业的提法保留在那里
  4. NHibernate说: Deleted object would be re-saved by cascade

解决方案(S):

  • 确保公司永远不会被加载(作为代理)
  • 或者Remove()占有也来自company.Occupations
  • 不要在公司方面使用这样的映射:

(千万不能使用级联)

<bag name="Occupations" lazy="true" inverse="true" batch-size="25" 
     cascade="all-delete-orphan">
     // this above setting on Company side is making issues...
  <key column="Company_ID" />
  <one-to-many class="Occupation" />
</bag>
Run Code Online (Sandbox Code Playgroud)

  • @Gattaka 你的问题的根源是你混合了持久性模型和域模型。这样做会给您的业务对象强加 NHibernate 问题,例如这个问题。你不能随意改变你的持久模型(即 NHibernate 映射模型),因为系统到处传递它。Radim 的答案是正确的,但是这个问题很难调试,因为它通常只出现在某些数据模式中。 (2认同)