Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用实体框架中的更改跟踪撤消/重做_C#_Entity Framework 4_Metadata - Fatal编程技术网

C# 使用实体框架中的更改跟踪撤消/重做

C# 使用实体框架中的更改跟踪撤消/重做,c#,entity-framework-4,metadata,C#,Entity Framework 4,Metadata,我正在尝试使用POCO实体实现基于实体框架的撤销/重做功能。因此,在我想要跟踪的每次更改之后,我调用ChangeTracker来修改实体,调用ObjectStateManager来修改关系(即导航属性)。我使用当前值和以前的值存储所有更改,以便能够在历史中来回移动 我现在的问题是,对于具有导航属性和相应外键的实体,如果引用的实体是新添加到DbContext中的,则这两个值不会正确同步 澄清一下:假设我有这些课程: public class EntityFilter { [Key]

我正在尝试使用POCO实体实现基于实体框架的撤销/重做功能。因此,在我想要跟踪的每次更改之后,我调用ChangeTracker来修改实体,调用
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
检查我更新的实体是否有外键和相应的导航属性,在这种情况下,通过反射手动更新它,但我不确定实际需要检查哪些数据

有没有办法使外键和导航属性与添加的实体保持同步?或者你有什么建议我可以试试吗


多谢各位

以下是我的结局:

我保留了一份所有添加实体的单独列表。然后,当我必须恢复由外键支持的导航属性时,我会搜索该列表并手动设置导航属性。最困难的部分是找出如何检查数据模型是否需要此修复,以及如何找到相应属性的名称

整个系统在最大程度上通用性方面仍然存在一些缺陷,但它在满足我们的需要方面运行得相当好