通过 Linq - EntityFramework - SQL 数据库连接的数据不会'refresh'



可能的引用

我发现了一个类似的问题:刷新没有建议解决方案的SQL数据库连接(更多检查代码(

当数据库中的数据发生更改时,LINQ to SQL 不会更新,这应该更接近我的问题。

设置

我允许用户在运行时更改连接字符串(通过 SqlConnectionStringBuilder、EntityConnectionStringBuilder 和"New EntityClient.EntityConnection(entityconn((("(我将实体连接与 .打开并使用"New Database.DatabaseContainer(entityConnection(">

我一直使用相同的容器来读取数据库数据。 和调用" .保存更改",并且到目前为止没有明确使用事务。(我希望"SaveChanges"自动执行提交,如果在提交之前缓存的数据已更改,则引发异常(

问题描述

当我执行 2 个程序并使用一个程序更改数据时,另一个程序在另一个程序提交之前建立连接时不会注意到更改。

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

问题

如何刷新本地缓存数据,如何处理赛车问题?

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

猜想我如何能够解决问题的想法

也许命令"Container.Refresh(Objects.RefreshMode.StoreWins,entity(可能会有所帮助,但我不确定将哪个对象作为实体。我刚刚从缓存数据库中读取的过时那个?而tere仍然是问题所在,我不确定这种冲突何时会发生。

也许它应该是事务或更改事务范围的东西,确保所有更改只进行(或反复尝试进行(,直到自事务开始以来数据库中没有更改?这是否可能,或者如何处理已被另一个具有活动事务的程序更改的数据?

你看到的是标识映射行为,它是 EF 的核心功能。

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

刷新

objectContext.Refresh(RefreshMode.StoreWins, entity); 

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:

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

最新更新