【发布时间】:2011-02-26 20:53:43
【问题描述】:
我有两个定义了多对多关系的实体。
<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.
我很困惑,因为我在实体上定义了级联,不应该从 ServiceProviderAccountTreasuryCode 中删除行?
更新
好的,看起来 ExecuteUpdate 不是在寻找 NHibernate 级联,可能是因为它在删除实体之前没有加载它?无论如何,还有其他方法可以从 ServiceProviderAccountTreasuryCode 表中删除,然后通过 HQL 从 ServiceProviderAccounts 中删除吗?我知道我可以在数据库上使用级联,但我想避免这种情况。我想要的是通过 HQl 从多对多关联表中删除行。是否可以?还是我应该使用纯 SQL?
【问题讨论】:
标签: nhibernate hql nhibernate-mapping