在断开连接的通用环境中更改导航属性关系和删除集合项

时间:2013-08-20 12:33:39

标签: entity-framework-4 ef-code-first

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

 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();
  }
}

0 个答案:

没有答案