我有一个表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现在应该删除级联通信中引用的记录 - 应该'它?
我希望有人可以帮助我,我做错了什么。
答案 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中不起作用。您可以尝试创建数据库级约束。