1

すべての変更を内部的に追跡できる次の 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();
  }
}
4

0 に答える 0