2011-03-01 6 views
1

私のRIAサービスコンテキストクラスには、Task to Operationの関連付けのリストを含むエンティティセットTaskToOperationAssociationsがあります。RIAサービス:削除されたエンティティを列挙する

コレクションから削除された関連エンティティを「見つける」方法はありますか?私はコンテキストが削除されたAssociationへの参照をプライベートフィールドに持っていることがわかります(明らかに、削除操作を送信できるようにそれを追跡する必要があります)。ここ

は例です...

私がある場合は、タスク "A"(とID = T1)とタスクB(IDはO1、O2とO3で)動作X、Y及びZに関連しています( ID = T2)は同じ動作と関連していると次のようにコレクションは... 3 TaskToOperationAssociationsを含むであろう

  1. 協会A1、タスクID = T1、OperationID = 1
  2. 協会A2、タスクID = T1、OperationID = 2
  3. アソシエーションA3、タスクID = T1、オペレーションID = 3
  4. 協会A4、タスクID = T2、OperationID = 1
  5. 協会A5、タスクID = T2、OperationID = 2
  6. 協会A6、タスクID = T2、OperationID = 3

IアソシエーションA1を除去しTaskToOperationAssociationsのプロパティ変更イベントをキャッチします。イベントハンドラでは、タスクT1の関連付けが変更されたかどうかを確認したいので、UIで保存ボタンを有効にすることができます。

希望はこれが理にかなっています。 ありがとう ベン

答えて

0

コンテキストのみを使用してこれを行う方法はありません。コンテキストをラップし、手動で削除を追跡することで修正しました。多分これはT1

のための任意の削除された団体は、あなたが

foreach (var assoc in deleted) 
{ 
    Context.TaskToOperationAssociations.Add(assoc); 
    ((IRevertibleChangeTracking)assoc).RejectChanges(); 
    ((IRevertibleChangeTracking)T1).RejectChanges(); 
} 

であるかどうかを確認することができ

var deleted = Context.EntityContainer.GetChanges().RemovedEntities 
    .Where(re => re is TaskToOperationAssociations && ((TaskToOperationAssociations)re.GetOriginal()).TaskId == T1.Id) 
    .Select(re => (TaskToOperationAssociations)re); 

か、単に

var hasDeleted = Context.EntityContainer.GetChanges().RemovedEntities 
    .Any(re => re is TaskToOperationAssociations && ((TaskToOperationAssociations)re.GetOriginal()).TaskId == T1.Id) 

をすることができます助けることができる

1

ChangeSetを列挙できます。ChangeSetには、送信前にすべてが含まれます。サーバー側では、OnSaveChangesを代行受信し、ChangeSetを列挙することもできます。

既存の関連付けの変更の場合、主にチェンジセットには外部キーの変更が含まれます。現在のコンテキストのエンティティコンテナには、まだ送信されていないChangeSetが含まれます。

+1

はい! context.EntityContainer.GetEntitySet ().Where(x => x.EntityState == EntityState.Deleted)を実行できます。ありがとう、利用可能なプロパティを調べるときにクイックウォッチを使用する場合、EntityContainerは役に立たなかったかプライベートであると仮定していたはずです。 – BenCr

+0

私はこれを完全にテストしたわけではありません。以前テストしたことがありましたが、実際には動作しませんでした。 – BenCr

+0

申し訳ありません、あなたの最後のコメントを説明できますか? AcceptChangesを呼び出すか、エンティティでIEditableObject.EndEditを実行した場合にのみ、変更が保存されます。それを呼び出すのに最適な時間は、送信される予定のChangeSetを表示するOnSubmitChangesメソッドになります。このために、DBContextの部分クラスを作成し、変更を検査するOnSubmitChangesメソッドをオーバーライドすることができます。 –

1

完全に元に戻す削除(まだ変更をコミットしていない場合)

+0

答えFabianoのおかげで、私は明日この会社を離れることになりますが、私は彼らが将来それを使うことができるかどうかを他の人に伝えます。あなたが恩恵を受けていたので、あなたがすぐにここに来なかったのを恥ずかしく思ったのです。 – BenCr

+0

RejectChangesコードが確実に機能することは確実ですか?あなたが列挙しているコレクションを変更するように見えます:)私はとにかくそれを行う必要はありませんが、他のものはすばらしいように見え、コンパイルはすばらしいスタートです。私は明日それを完全にテストします。 – BenCr

関連する問題