1

WPFのコンパイルでセルフトラッキングエンティティを使用するときに問題が発生します。

たとえば、PeopleとNumbersの2つのエンティティが設定されています。それぞれの人には多くの番号があり、多くの番号に人がいる可能性があります。

ここに私が番号の削除を期待するサンプルコードがあります:

using (var db = new Model.SampleEntities())
{
    list = db.People.Include("Numbers").ToList();
}

var samplePerson = list[0];
samplePerson.StartTracking();
var number = samplePerson.Numbers.First();
p.Numbers.Remove(number);

using (var db = new Model.SampleEntities())
{
    foreach (Model.Person person in list)
    {
        db.People.ApplyChanges(person);
    }
    db.SaveChanges();
}

DBから番号を削除することはありません。

RemoveItemメソッドをオーバーライドしてTrackableCollectionクラス(Self-Tracking T4テンプレートによって生成される)を変更し、次のコードを追加すると、期待どおりに機能します。

protected override void RemoveItem(int index)
{
    var entity = ((IObjectWithChangeTracker)this[index]);
    base.RemoveItem(index);
    entity.MarkAsDeleted();
}

ここにMarkAsDeletedメソッドを配置するのは正しいですか?したがって、TTファイルを変更して、このコードをTrackableCollectionクラスに配置する必要があります。それは良いアプローチですか?

4

1 に答える 1

2

いいえ、正しくありません。あなたは人と数の間に多対多の関係を持っています。リレーションの削除(ジャンクションテーブルからのみレコードを削除する)とアイテム自体の削除を厳密に区別する必要があります。番号を削除すると、現在作業していない他の多くの人に影響を与える可能性があるため、これを自動的に行うべきではありません(さらにカスケード削除なし)。そのような場合は例外が発生します)。

リレーションを削除してアイテムを削除する場合は、MarkAsDeleted手動で呼び出します。さらに、大きな努力をしなければ、変更はモデル内のすべてのエンティティに影響しますが、これはあなたが望むものではありません。

于 2011-06-30T18:15:01.223 に答える