0

タイトルは、私が直面している問題をほぼ要約しています。基本的に私は2つのクラスを持っています:

public class Parent : IIntegerIdentifiable
{
   public virtual long Id { get; set; }
   public virtual ICollection<Child> Children {get; set; }
}

public class Child : IIntegerIdentifiable
{
    public virtual long Id { get; set; }
    public virtual Parent Parent { get; set; }
}

これらのクラス間に 1 対多の関係を定義しています。両方のクラス マップは次のとおりです。

public sealed class ParentMap : ClassMap<Parent>
{
    public ParentMap()
    {
        Id(x => x.Id).GeneratedBy.HiLo(
            "HiLoUniqueKey", "NextHi", "99", "ObjectType = 'Parent'"); 

        HasMany(x => x.Children).KeyColumn("Parent_Id").Inverse().Cascade.AllDeleteOrphan();
    }
}

public sealed class ChildMap : ClassMap<Child>
{
    public ChildMap()
    {
        Id(x => x.Id).GeneratedBy.HiLo("HiLoUniqueKey", "NextHi", "99", "ObjectType = 'Child'");
        References(x => x.Event).Cascade.All();
    }
}

特定の親のすべての子をデータベースから削除したかったので、ChildRepository に次の関数を記述しました。

    public void ClearChildEntries(long parentId)
    {
        //I had tried the following and was getting errors before I read the other posts on the topic
        //QueryOver().Where(x => x.Event.Id == eventId).List().ToList().ForEach(Remove);
        //Session.flush()

       //Current code
        var parent = _parentRepository.GetById(parentId);
        parent.Children.Clear();

        _parentRepository.SaveOrUpdate(parent);
    }

私たちのコードは、リクエストの最後にフラッシュが呼び出されるように設定されています。コードを実行しようとすると、次のエラーが表示されます。

値 NULL を列 'parent_id'、テーブル 'test.dbo.Child' に挿入できません。列はヌルを許可しません。更新は失敗します。

また、最初に各子エンティティを削除し、セッションをフラッシュしてから、親コレクションを更新しようとしました。同じエラーが発生します。問題は、a) nHibernate が親 ID 列を null に更新してから削除しようとするのはなぜですか? b) 削除を機能させるにはどうすればよいですか?

私があなたの時間を無駄にしているのではないことを知っていただくために、このトピックに関する他の投稿を参照しました
- NHibernate で子オブジェクトを削除するには?
- http://ayende.com/blog/1890/nhibernate-cascades-the-different-between-all-all-delete-orphans-and-save-update
しかし、何も機能していないようです。誰かが私を正しい方向に向けることができますか? ご協力ありがとうございました!!

4

1 に答える 1

0

Cascade オプションで何かをしなければならないと思います Cascade を All_Delete_Orphan From Cascade.All に変更してみてください

http://ayende.com/blog/1890/nhibernate-cascades-the-different-between-all-all-delete-orphans-and-save-update

于 2012-06-25T03:53:47.223 に答える