C# 使用实体框架中的更改跟踪撤消/重做
我正在尝试使用POCO实体实现基于实体框架的撤销/重做功能。因此,在我想要跟踪的每次更改之后,我调用ChangeTracker来修改实体,调用C# 使用实体框架中的更改跟踪撤消/重做,c#,entity-framework-4,metadata,C#,Entity Framework 4,Metadata,我正在尝试使用POCO实体实现基于实体框架的撤销/重做功能。因此,在我想要跟踪的每次更改之后,我调用ChangeTracker来修改实体,调用ObjectStateManager来修改关系(即导航属性)。我使用当前值和以前的值存储所有更改,以便能够在历史中来回移动 我现在的问题是,对于具有导航属性和相应外键的实体,如果引用的实体是新添加到DbContext中的,则这两个值不会正确同步 澄清一下:假设我有这些课程: public class EntityFilter { [Key]
ObjectStateManager
来修改关系(即导航属性)。我使用当前值和以前的值存储所有更改,以便能够在历史中来回移动
我现在的问题是,对于具有导航属性和相应外键的实体,如果引用的实体是新添加到DbContext中的,则这两个值不会正确同步
澄清一下:假设我有这些课程:
public class EntityFilter
{
[Key]
public Guid ID { get; set; }
public virtual ICollection<EntityConnection> IsSource { get; set; }
public virtual ICollection<EntityConnection> IsSink { get; set; }
//other stuff
}
public class EntityConnection
{
[Key]
public Guid SinkFilterID { get; set; }
[ForeignKey("SinkFilterID")]
public virtual EntityFilter Sink { get; set; }
public Guid SourceFilterID { get; set; }
[ForeignKey("SourceFilterID")]
public virtual EntityFilter Source { get; set; }
//more stuff
}
公共类EntityFilter
{
[关键]
公共Guid ID{get;set;}
公共虚拟ICollection IsSource{get;set;}
公共虚拟ICollection IsSink{get;set;}
//其他东西
}
公共类实体连接
{
[关键]
公共Guid SinkFilterID{get;set;}
[外键(“SinkFilterID”)]
公共虚拟EntityFilter接收器{get;set;}
公共Guid SourceFilterID{get;set;}
[ForeignKey(“SourceFilterID”)]
公共虚拟EntityFilter源{get;set;}
//更多的东西
}
EntityConnection
基本上是过滤器之间的多对多关系,但它实际上包含更多字段,这就是我无法摆脱它的原因。另外,我希望尽可能的笼统,而不是依赖于我们的实际数据模型
如果我添加一个新的过滤器,然后将其连接到一个现有的过滤器(也可能是一个新的过滤器),就会出现问题。撤消连接仍然可以,但当我尝试重做时,我的程序将崩溃。我可以在恢复的连接中看到外键SinkFilterID
具有正确的值,但Sink
为null
(根据连接的方向,源代码也可能发生同样的情况)。手动调用DetectChanges
没有任何区别。在两个现有筛选器之间添加连接(即它们以前已存储在db中)没有问题
检测到此类型的新连接的更改仅包含来自ChangeTracker
的实体更改,而不包含来自ObjectStateManager
的关系更改。我想这是因为关系已经由外键处理,它包含在PreviousValues
的属性中
我已经读到EntityState.Added
状态中的实体获得临时密钥,并且不完全支持对它们的更改跟踪。我能让它工作吗
我尝试使用MetadataWorkspace
检查我更新的实体是否有外键和相应的导航属性,在这种情况下,通过反射手动更新它,但我不确定实际需要检查哪些数据
有没有办法使外键和导航属性与添加的实体保持同步?或者你有什么建议我可以试试吗
多谢各位 以下是我的结局: 我保留了一份所有添加实体的单独列表。然后,当我必须恢复由外键支持的导航属性时,我会搜索该列表并手动设置导航属性。最困难的部分是找出如何检查数据模型是否需要此修复,以及如何找到相应属性的名称 整个系统在最大程度上通用性方面仍然存在一些缺陷,但它在满足我们的需要方面运行得相当好