级联删除不与NHibernate工作(Delete Cascade is not working w

2019-10-20 08:41发布

我有有PersonCompany参考表通讯。 在用于PersonCompany映射我已经定义了一个级联删除此参考:

this.HasMany(x => x.Communications)
  .AsSet()
  .KeyColumn("PersonCompanyId")
  .Fetch.Select()
  .Inverse()
  .Cascade.Delete();

但是,当我现在执行休耕HQL查询:

var sql = "delete from PersonCompany where Person.Id in (:idList) or Company.Id in (:idList)";

var query = NHibernateHelper.CurrentSession.CreateQuery(sql);
query.SetParameterList("idList", contactIdList);
query.SetTimeout(0);
query.ExecuteUpdate();

我总是得到此SQLException:

DELETE语句冲突与基准约束“FK_PersonCompany_Communication”。 冲突发生于数据库“proconact”,表“dbo.Communication”,列“PersonCompanyId”。 该语句已终止。

我认为,现在的NHibernate应该删除级联通信所引用的记录 - should'nt呢?

我希望有人能帮助我,我在做什么错。

Answer 1:

你使用的语法是这样的事实部分

  • 13.3。 DML风格的操作 ,

这实际上是用于批量操作的数据库服务器上。 他们使用的HQL语法,但不包括级联(因为他们没有在内存中执行,只是在DB侧)

通过这种方式,我们可以加载的对象,要删除......并明确将其删除。 这将触发级联:

//var sql = "delete from PersonCompany where Person.Id in (:idList) or Company.Id in (:idList)";
var sql = "from PersonCompany where Person.Id in (:idList) or Company.Id in (:idList)";
var query = NHibernateHelper.CurrentSession.CreateQuery(sql);
query.SetParameterList("idList", contactIdList);
query.SetTimeout(0);
//query.ExecuteUpdate();
var list = query.List<PersonCompany >();
foreach (var item in list)
{
    session.Delete(item);
}
session.Flush();

发生了什么事是,每一个项目被删除,并放置在ISession 。 在Delete()所有级联被正确执行

  • 9.9。 Lifecyles和对象图


Answer 2:

这样做的是,

IList<PersonCompany> _pCompanies = ....; <load the required person companies>
foreach (var pc in _pCompanies)
{
_session.delete(pc);
}

因为当你使用批量更新,内置的约束是不会NHibernate的工作。 你可以尝试创建一个数据库级别的约束。



文章来源: Delete Cascade is not working with NHibernate