1

我有以下两个能够在内部跟踪所有更改的类。

 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