0

私は2つのクラスを持っています:

public class Entry{
  ...
  public virtual IsDeleted {get;set;}
  public virtual int MyClsId {get;set;}
  public virtual MyClass MyCls {get;set;}
}

public class MyClass{
  ...
  public virtual ICollection<Entry> Entries {get;set;}
}

MyClass.Entries からアイテムを削除すると、実際には削除したり、現実を殺したりしたくありません。Entry.IsDeleted を true に設定したいだけで、Entry に myClass の Id を保持させたいと思っています。

myClassObj.Entries.Remove(myEntry); // after this line myEntry.MyCls.Id 
                                    // should stay intact. myEntry.IsDeleted 
                                    // should be set to true;

どうやってやるの?インターセプターを試してみましたが、機能させることができませんでした。

編集

マッピング:

私が使用するフィールドの別のフォームマッピング:

MyClassMap : ...
{
  HasMany(x => Entries).KeyColumn("MyClsId");
}
4

5 に答える 5

1

実際にコレクションからこれを削除したいようには思えません。おそらく、次Entryのようなメソッドを配置する方が理にかなっています

public void Delete(){
    IsDeleted = true;
}

そして代わりに

myClassObj.Entries.Remove(myEntry);

行う

myEntry.Delete();
于 2013-05-17T13:24:25.797 に答える
1

この場合、削除の代わりにエンティティを更新する必要があります。でマッピングを変更してみてください

// set cascade to all to add/update/delete this childs by parent.
HasMany(x => Entries).KeyColumn("MyClsId").Cascade.All();

次にMyClass、メソッドを作成して更新します。

public class MyClass{
  ...
  public virtual ICollection<Entry> Entries {get;set;}

  public void DeleteEntry(Entry entry)
  {
      entry.IsDelete = true;   
  }
}

Entryオブジェクトを IsDeleted に設定して、オブジェクトを渡すメソッドをtrue呼び出し、インスタンスを永続化するだけの場合、子は一緒に永続化されます。DeleteEntryMyClass

session.SaveOrUpdate(myClassObj);
于 2013-05-17T13:45:53.520 に答える
1

あなたのシナリオを正しく理解している場合は、最後に削除アクションが必要です。

  • 関係を保つ
  • アイテムを次のようにマークしますIsDeleted
  • 親のコレクションに保持しないでください(ここではわかりませんが、必要に応じて以下の解決策があります)

1) 関係を維持するために、delete を最後まで呼び出しません。

親にメソッドを導入できますRemoveEntry

public class MyClass 
{
  public virtual void RemoveEntry(Entry entry) // or by index, name
  {
     // some checks over Entries collection
     entry.IsDeleted = true;
  }
}

MyClass インスタンスが更新されるsession.Update(myClass)と、すべてのエントリも更新されます

2) としてマークするにはIsDeleted、カスケードを追加するだけです (詳しくはこちらの流暢なマッピングを参照してください)。

MyClassMap : ...
{
  HasMany(x => Entries)
   .KeyColumn("MyClsId")
   .Cascade.All()
}

3) Parent children コレクションの遅延読み込みからそのアイテムを削除するwhereには、コレクション マッピングに句を追加します。ここで例を参照してください:マッピングの where 句

MyClassMap : ...
{
  HasMany(x => Entries)
    .KeyColumn("MyClsId")
    .Cascade.All()
    .Where("IsDeleted = 0"); // that will load only IsDeleted == false lazily
}

ドキュメントの where 句の詳細: 6.2. コレクションのマッピング

于 2013-05-17T14:07:51.680 に答える
1

目的を達成する 1 つの方法は、エンティティ ダイレクトを使用するのではなく、エンティティのコピーである DTO (すべてのコレクション アイテムを含む) を使用することです。DTO で削除アクションを実行し (そのため、削除されたコレクション アイテムはアプリケーションに表示されません)、後でエンティティを保存する場合は、DTO と同期するだけです (削除されたコレクション アイテムについては、IsDeleted フラグを true に設定します)。 )。もう少し手間がかかりますが、やりたいことは達成できます。

于 2013-05-17T19:07:12.563 に答える