删除Cascade不适用于NHibernate

时间:2014-06-29 14:32:37

标签: c# nhibernate fluent-nhibernate cascade nhibernate-cascade

我有一个表Communication,它引用了PersonCompany。 在PersonCompany的映射中,我为此参考定义了一个Cascade-Delete:

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

但是当我现在执行暂停的HQL-Query时:

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语句与REFERENCE约束冲突" FK_PersonCompany_Communication"。冲突发生在数据库" proconact",table" dbo.Communication",column' PersonCompanyId'中。   声明已经终止。

我认为,NHibernate现在应该删除级联通信中引用的记录 - 应该'它?

我希望有人可以帮助我,我做错了什么。

2 个答案:

答案 0 :(得分:0)

您使用的语法实际上是

的一部分

实际上用于DB服务器上的BULK操作。它们使用HQL语法,但不包括级联(因为它们不在内存中执行,只在数据库端执行)

这样,我们可以加载要删除的对象......并明确删除它们。这将触发级联:

//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()期间,所有级联都已正确执行

答案 1 :(得分:0)

方法是,

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

因为当您使用批量更新时,内置约束在Nhibernate中不起作用。您可以尝试创建数据库级约束。