gpt4 book ai didi

nhibernate - 多对多和 HQL 批量删除

转载 作者:行者123 更新时间:2023-12-04 06:33:13 24 4
gpt4 key购买 nike

我有两个定义了多对多关系的实体。

<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 中删除行吗?

更新

好的,看起来 ExecuteUpdate 不是在寻找 NHibernate 级联,可能是因为它在删除之前没有加载实体?无论如何,还有其他方法可以通过 HQL 从 ServiceProviderAccountTreasuryCode 表中删除,然后从 ServiceProviderAccounts 中删除吗?我知道我可以在数据库上使用级联,但我想避免这种情况。我想要的是通过 HQl 从多对多关联表中删除行。是否可以?或者我应该使用纯 SQL?

最佳答案

看起来你有一个参照完整性问题,即一个外键关系,你正在删除的 id 被其他地方引用,而该表最终将不引用任何内容。如果这是您想要做的,那么您可以运行 截断 命令,但我不确定你为什么要这样做..

我建议你做一个正常的删除,即使用 nhibernate session 和 Linq,如下所示:

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

现在请注意,这完全不是删除的坏方法,因为它们不会立即针对 dB 触发,并且是 session 的一部分,直到您的事务提交,如果您的映射正确定义,这应该处理您的引用完整性问题。

希望这有效..

关于nhibernate - 多对多和 HQL 批量删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5129676/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com