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