.net 通过Linq-EntityFramework-SQL数据库连接的数据不';刷新';

.net 通过Linq-EntityFramework-SQL数据库连接的数据不';刷新';,.net,sql,linq,entity-framework,.net,Sql,Linq,Entity Framework,可能的参考资料 我发现了一个类似的问题:这并不意味着解决方案(更多信息请查看代码) 这应该更接近我的问题 设置 我允许用户在运行时更改connectionstring(通过SqlConnectionStringBuilder、EntityConnectionStringBuilder和“New EntityClient.EntityConnection(entityconn())”) 我将EntityConnection与.Open和“New Database.DatabaseContainer

可能的参考资料

我发现了一个类似的问题:这并不意味着解决方案(更多信息请查看代码)

这应该更接近我的问题

设置

我允许用户在运行时更改connectionstring(通过SqlConnectionStringBuilder、EntityConnectionStringBuilder和“New EntityClient.EntityConnection(entityconn())”) 我将EntityConnection与.Open和“New Database.DatabaseContainer(EntityConnection)”一起使用

我一直使用相同的容器来读取db数据。和用于调用“.SaveChanges”,并且到目前为止不显式使用事务。(我希望“SaveChanges”能够自动执行提交,并在提交之前缓存的数据发生更改时抛出异常)

问题描述

objectContext.YourEntitySet.MergeOption = MergeOption.OverwriteChanges;
var data = objectContext.YourEntitySet.
              /* Any query you want to execute to refresh your data */
              ToList();
当我执行两个程序并用一个程序更改数据时,另一个程序在提交另一个程序之前建立连接时不会注意到这些更改

例如,如果我有两次相同的程序(A和B),则会发生以下情况: 开始A,开始B,更改A中的数据,B无法读取更改的数据(因为它在A完成更改之前启动了连接)

问题

objectContext.YourEntitySet.MergeOption = MergeOption.OverwriteChanges;
var data = objectContext.YourEntitySet.
              /* Any query you want to execute to refresh your data */
              ToList();
如何刷新本地缓存数据,以及如何处理赛车问题

当我刷新A的连接,然后更改数据,但同时B被刷新并开始更改数据时,B可能会覆盖A的更改,而不会注意到。每当刷新后更改数据库时,就会发生这种情况。我上面提到的第二个问题似乎没有解决这个问题

我猜测的我如何解决问题的想法

也许命令“Container.Refresh(Objects.RefreshMode.StoreWins,entity)”可能会有帮助,但我不确定作为entity提供什么对象。我刚刚从缓存数据库读取的过时对象?tere仍然是问题所在,我不确定何时会发生冲突

也许它应该与transaction或Changed transactionscope相关,确保只进行(或反复尝试进行)所有更改直到事务启动后数据库中没有更改?这是可能的吗?或者如何处理另一个具有活动事务的程序已经更改的数据?

您看到的是行为,这是EF的核心功能

要解决刷新问题,您可以使用

刷新

objectContext.Refresh(RefreshMode.StoreWins, entity); 
实体
是以前从数据库中检索到的要刷新的对象

合并选项

objectContext.YourEntitySet.MergeOption = MergeOption.OverwriteChanges;
var data = objectContext.YourEntitySet.
              /* Any query you want to execute to refresh your data */
              ToList();
MergeOption
控制将数据读取到标识映射的方式。默认设置为
AppendOnly
,它将仅具体化以前未加载但已加载的实体将保持完整-这是核心功能,因为否则任何查询都将能够覆盖未保存的状态


第二个问题与您最初的问题完全无关。如果您担心一个应用程序在准备修改其他应用程序时会更改数据,则需要处理。

我不确定这是否有助于您解决EF问题,但请看一下:


“SqlDependency允许您在数据库中的原始数据更改时接收通知,以便刷新缓存。“

谢谢你的快速回答。现在我了解了我必须阅读的更多内容。当您链接时,我阅读了关于并发性的文章,随后链接到EF模型并在其中应用了属性concurrency Mode=Fixed to my Timestamp variable(这是大多数表中使用的complextype中的一个变量)。紧接着,我总是收到最新的时间戳,即使以前只有旧的“缓存”数据的旧连接也是如此。我很高兴这些问题有简单的解决方案。谢谢,我认为这也很有用。我正在开发一个客户机应用程序,但可能会有不到3人同时使用它,最多10人,因此数据库更改的eventhandler应该可以工作,而且感觉是在发生更改时立即刷新数据的好方法。我猜它使用了观察者模式和数据库中的寄存器,因为这可以解释为什么只建议将该结构用于最多几个活动客户端。我也会读更多关于这方面的东西