2011-02-26 89 views
2

我有两个实体上定义了许多一对多的关系。许多一对多和HQL批量删除

<set name="TreasuryCodes" table="ServiceProviderAccountTreasuryCode" lazy="true" cascade="all"> 
    <key column="ServiceProviderAccountId" /> 
    <many-to-many column="TreasuryCodeId" class="TreasuryCode" /> 
</set> 

<set name="ServiceProviderAccounts" table="ServiceProviderAccountTreasuryCode" lazy="true" inverse="true" cascade="all"> 
    <key column="TreasuryCodeId" /> 
    <many-to-many column="ServiceProviderAccountId" class="ServiceProviderAccount" /> 
</set> 

现在我想通过ServiceProviderId删除所有ServiceProviderAccounts。我写这篇文章的代码:

public void DeleteAllAccount(int serviceProviderId) 
    { 
     const string query = "delete ServiceProviderAccount spa where spa.ServiceProvider.Id = :serviceProviderId"; 
     repository.Session.CreateQuery(query) 
      .SetInt32("serviceProviderId", serviceProviderId) 
      .ExecuteUpdate(); 
     repository.Session.Flush(); 
    } 

,我收到此异常:

Test method Test.ServiceRepositoryTest.DeleteAllAccountTest threw exception: 
NHibernate.Exceptions.GenericADOException: could not execute update query[SQL: delete from ServiceProviderAccount where ServiceProviderId=?] ---> System.Data.SqlClient.SqlException: The DELETE statement conflicted with the REFERENCE constraint "FKBC88A84CB684BF79". The conflict occurred in database "Test", table "dbo.ServiceProviderAccountTreasuryCode", column 'ServiceProviderAccountId'. 
The statement has been terminated. 

我很困惑,因为我已经对实体定义的级联,不应NHibernate的从ServiceProviderAccountTreasuryCode删除行?

UPDATE


OK,貌似executeUpdate的不是找NHibernate的级联反应,可能是因为它没有删除之前加载实体?反正是有任何其他方式从ServiceProviderAccountTreasuryCode表,然后通过HQL从ServiceProviderAccounts删除?我知道我可以在数据库上使用级联,但我想避免这种情况。我要的是HQL删除许多-to-many关联表行。可能吗?或者我应该使用普通的SQL?

回答

3

看起来你有即foregin键关系船参照完整性问题,在您要删除的ID被引用在别的地方,那张桌子最终只会引用任何东西。如果这是你想要做什么,然后你可以运行截断命令,但我不知道为什么你会做..

我会建议你做一个正常的使用NHibernate会话删除IE和LINQ像下面:

foreach(var sessionProvider in Session.Linq<ServiceProviderAccount >().Where(x=>x.ServiceProvider.Id==servinceProviderId)) 
     Session.Delete(sessionProvider); 

现在,请注意,这根本不是一个糟糕的方式做你删除,因为他们不反对立即分贝解雇,是会话的一部分,直到你的事务被提交,这应该处理您的引用完整性问题如果你的映射是正确定义的。

希望这项工作..

+0

是的,我做了一些研究,看起来像你的解决方案是唯一的。谢谢 – Davita 2011-02-27 08:49:07

0

看起来它不服从级联。对于更新HQL批处理操作/删除是相对较新,或多或少直接转换为SQL。我相信你也必须跟踪相关的表格。

如果你只是删除单个的实体,则批量删除不会做你多好。为了使NHibernate实际上考虑级联,它必须加载实际的实体,而不是你的例子。

我问过类似的问题,我得到的答案你可能感兴趣的

Remove entity in NHibernate only by primary key

+0

我不删除一个单一的实体。我一次删除几个。我想要的是产生类似DELETE FROM [table]的东西where_filed = @someparam – Davita 2011-02-26 21:06:00