2

私の各POCOのコンストラクターには、次のものがあります。

this.StartTracking();

POCO のいずれかのすべてのインスタンスで追跡がオンになっていることを確認します。エンティティ B の TrackableCollection を含むエンティティ A があります。エンティティ A のインスタンスを次のようにロードすると、次のようになります。

using(MyContext ctx = new MyContext())
{
    entityA = ctx.EntityA.Include("EntityB").Where(x => x.Id== id).FirstOrDefault();
}

エンティティ A の ObjectsAddedToCollection プロパティを見ると、「未変更」のフラグが立てられたオブジェクトが 1 つあります。entityA.EntityB[0].MarkAsDeleted() を実行すると、状態が「削除済み」に設定されず、ObjectsRemovedFromCollection コレクションに移動されません。完全に削除されるだけです。再確認したところ、エンティティ A とエンティティ B の両方で ChangeTrackingEnabled が True に設定されています。これが機能しない理由はありますか? このため、子エンティティを削除してデータベースへの変更を永続化することはできません。

4

2 に答える 2

2

これはバグのようです。メソッド RecordRemovalFromCollectionProperties で、単純に戻る行を次のように変更しました。

if(((IObjectWithChangeTracker) value).ChangeTracker.State == ObjectState.Added)
    return;

これにより、私が抱えていた問題が修正されました。

于 2010-08-18T20:52:55.990 に答える
0

ただし、この生成されたコードを変更することによって、かなり危険です。メソッドが行うことは、追加されたオブジェクトが再び削除されるかどうRecordRemovalFromCollectionPropertiesかを確認することです (最終状態 = 追加または削除されたエンティティはなく、追加と削除は「互いに打ち消し合っています...?」)。そのため、RecordAdditionToCollectionProperties前に説明したことの「逆」チェックを行う もあります。

ここで、ChangeTracker のこのメソッドを変更すると、追加された EntityB と削除された EntityB (同じインスタンス) を持つ EntityA を送信する可能性があります。これは、ユーザーまたは何らかの方法でコードによって実行できます。

オブジェクト コンテキストが最初にこれを許可するかどうかはわかりません。しかし、それは少なくとも少し非効率的です。オブジェクトコンテキストに言う更新された EntityA を送信する ( context.ApllyChanges(EntityA)) この EntityB を追加し、その後すぐに、この同じ EntityB も削除してください ;)

私はこの分野でいくつかの経験があるので、さらに質問があれば...

元の問題には理由があると思いますが、あなたの解決策は少し大雑把です。

于 2010-12-12T20:02:34.613 に答える