すべての変更を内部的に追跡できる次の 2 つのクラスがあります。
public class Agent
{
public int AgentId { get; set; }
public ICollection Roles { get; set; }
public ICollection DeletedCollectionItems { get; set; }
public ICollection NewCollectionItems { get; set; }
ChangeTrackingState State { get; set; }
....
}
public class Role
{
public int RoleId { get; set; }
public ICollection Agents { get; set; }
public ICollection DeletedCollectionItems { get; set; }
public ICollection NewCollectionItems { get; set; }
ChangeTrackingState State { get; set; }
...
}
1) ナビゲーション プロパティが設定されている場合は、元のオブジェクトが DeletedCollectionItems に追加され、新しいオブジェクトが NewCollectionItems に追加されます。
2) オブジェクトがコレクションに追加または削除されると、関連するコレクションも更新されます。たとえば、役割が Agent.Roles から削除されると、役割が DeletedCollectionItems に追加されます。
私の問題は次のとおりです。
切断された環境で EF を使用すると、ルート エンティティ (エージェント) をコンテキストに戻すときに、すべての変更を「再生」する必要があります。既存のエージェントを更新していて、役割を削除した場合、現在データベースにある関係を再作成して削除し、SaveChanges を呼び出したときに変更がデータベースに反映されるようにするにはどうすればよいですか?
これを一般的な方法で行う必要があるため、コードを複製せず、単純にルート オブジェクトとして渡してオブジェクトを渡すことができます。Julie Lerman の ApplyChanges メソッドの実装に基づいています
private static void ApplyChanges<TEntity>(TEntity root)
where TEntity : class, IObjectWithState
{
using (var context = new GeniusContext())
{
if (root.IsNew)
{
context.Set<TEntity>().Add(root);
}
else
{
context.Set<TEntity>().Attach(root);
}
foreach (var entry in context.ChangeTracker
.Entries<IObjectWithState>())
{
IObjectWithState stateInfo = entry.Entity;
entry.State = ConvertState(stateInfo.State);
}
context.SaveChanges();
}
}