2011-02-26 59 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