1

PersonCompany への参照を持つテーブル Communication があります。PersonCompany のマッピングでは、この参照に対して Cascade-Delete を定義しました。

this.HasMany(x => x.Communications)
  .AsSet()
  .KeyColumn("PersonCompanyId")
  .Fetch.Select()
  .Inverse()
  .Cascade.Delete();

しかし、次の HQL-Query を実行すると、次のようになります。

var sql = "delete from PersonCompany where Person.Id in (:idList) or Company.Id in (:idList)";

var query = NHibernateHelper.CurrentSession.CreateQuery(sql);
query.SetParameterList("idList", contactIdList);
query.SetTimeout(0);
query.ExecuteUpdate();

私はいつもこのSqlExceptionを取得します:

DELETE ステートメントは、REFERENCE 制約 "FK_PersonCompany_Communication" と競合しました。データベース「proconact」、テーブル「dbo.Communication」、列「PersonCompanyId」で競合が発生しました。ステートメントは終了されました。

NHibernate は、Communication で参照されているレコードをカスケード削除する必要があると思います。そうではありませんか?

私が間違っていること、誰かが私を助けてくれることを願っています。

4

2 に答える 2

1

使用した構文は、実際には

実際には、DB サーバーでの BULK 操作に使用されます。それらは HQL 構文を使用しますが、カスケードをカバーしていません (メモリ内で実行されず、DB 側でのみ実行されるため)。

このようにして、削除するオブジェクトをロードし、明示的に削除することができます。これにより、カスケードがトリガーされます。

//var sql = "delete from PersonCompany where Person.Id in (:idList) or Company.Id in (:idList)";
var sql = "from PersonCompany where Person.Id in (:idList) or Company.Id in (:idList)";
var query = NHibernateHelper.CurrentSession.CreateQuery(sql);
query.SetParameterList("idList", contactIdList);
query.SetTimeout(0);
//query.ExecuteUpdate();
var list = query.List<PersonCompany >();
foreach (var item in list)
{
    session.Delete(item);
}
session.Flush();

何が起こったのかというと、すべてのアイテムが削除され、ISession. Delete()すべてのカスケードが適切に実行されている間

于 2014-06-29T15:06:23.733 に答える
0

やり方は、

IList<PersonCompany> _pCompanies = ....; <load the required person companies>
foreach (var pc in _pCompanies)
{
_session.delete(pc);
}

一括更新を使用すると、組み込みの制約が Nhibernate で機能しないためです。DB レベルの制約を作成してみてください。

于 2014-06-30T05:51:42.217 に答える