У меня есть две сущности с определенными отношениями «многие ко многим».
<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>
Теперь я хочу удалить все учетные записи ServiceProvider по ServiceProviderId. Я пишу этот код:
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
хорошо, похоже, ExecuteUpdate не ищет каскад NHibernate, возможно, потому, что он не загружает объекты перед его удалением? В любом случае, есть ли другой способ удаления из таблицы ServiceProviderAccountTreasuryCode, а затем из ServiceProviderAccounts через HQL? Я знаю, что могу использовать каскады в базе данных, но я хочу этого избежать. Я хочу удалить строки из таблицы сопоставления «многие ко многим» с помощью HQl. Является ли это возможным? Или я должен использовать простой SQL?