gpt4 book ai didi

c# - 为什么 nhibernate 提示删除这个对象?

转载 作者:行者123 更新时间:2023-11-30 15:30:09 25 4
gpt4 key购买 nike

我有几个对象。

  1. Project 对象 - 这代表一个基本项目

  2. ProjectDependency 对象 - 这是将一个项目映射到另一个项目(依赖项目)的映射对象。查看休眠关系:

这是 ProjectDependencies 映射类:

  public class ProjectDependencyMap
{
public ProjectDependencyMap()
{
References(x => x.Project).Not.Nullable().Fetch.Join();
References(x =>.DependencyProject).Not.Nullable().Column("DependencyProjectId").Fetch.Join();
}
}

这是项目 map 文件:

public class ProjectMap
{
public ProjectMap()
{
HasMany(x => x.ProjectDependencies).AsBag().Inverse().Cascade.AllDeleteOrphan().Fetch.Select().BatchSize(80);

HasMany(x => x.ProjectDependentOf).KeyColumn("DependentProjectId").AsBag().Inverse().Cascade.AllDeleteOrphan().Fetch.Select().BatchSize(80);

}
}

通常这工作正常,但有时当我使用以下方法删除项目时:

 var project = Model.GetProject(id);
Repository.Delete(project);
Repository.Commit()

我收到这个错误:

删除的对象将被级联重新保存(从关联中删除删除的对象)[ProjectDependency#324]

有人可以帮助澄清这里的问题是什么以及我使用上面的映射的方式是否不正确

最佳答案

为了这个答案的目的,我假设 Project.ProjectDependenciesProjectDependency.Project的另一边关系,而不是 ProjectDependency.Dependent关系。 (现在说快3倍)

考虑以下对象:

var projectA = new Project();
var projectB = new Project();
var dep1 = new ProjectDependency
{
Project = projectA,
Dependent = projectB
};
projectA.ProjectDependencies.Add(dep1);

...并将它们全部保存到数据库中。现在,让我们删除一个。

session.Delete(projectA);

一切正常。 NHibernate 级联删除 ProjectDependencies收藏,所以projectAdep1都被删除了。 projectB留在数据库中。

好的,让我们重新开始。让我们从projectA开始, projectB , 和 dep1在数据库中。此外,让我们添加这些:

var projectC = new Project();
var dep2 = new ProjectDependency
{
Project = projectC,
Dependent = projectA
};
projectC.ProjectDependencies.Add(dep2);

当我们删除 projectA 时会发生什么现在?

session.Delete(projectA);

一切都像以前一样进行。 dep1将被级联删除。然而,没有什么可以清理的dep2 ,因此错误。 dep2仍然引用 projectA ,我们正在尝试删除。

错误消息建议的解决方案是在尝试删除实体之前清理这些关系。但是,您将如何执行此操作?从 projectA 开始,我们如何找到dep2projectC清理它们?

两种选择:

  • 执行查询:session.Query<ProjectDependency>().Where(x => x.Dependent == projectA) ,然后手动清理关系。
  • 将另一个集合添加到 Project :
HasMany(x => x.DependentProjects)
.KeyColumn("DependentProjectId")
.AsBag()
.Inverse()
.Cascade.AllDeleteOrphan();

...然后 NHibernate 会为您进行清理工作。

关于c# - 为什么 nhibernate 提示删除这个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22649004/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com