我有以下两个能够在内部跟踪所有更改的类。
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();
}
}