我有有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呢?
我希望有人能帮助我,我在做什么错。
你使用的语法是这样的事实部分
这实际上是用于批量操作的数据库服务器上。 他们使用的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()
所有级联被正确执行
这样做的是,
IList<PersonCompany> _pCompanies = ....; <load the required person companies>
foreach (var pc in _pCompanies)
{
_session.delete(pc);
}
因为当你使用批量更新,内置的约束是不会NHibernate的工作。 你可以尝试创建一个数据库级别的约束。