2

我有一个ObjectDisplay由两个相关表组成的视图: ObjectState. State表示 的状态,视图从每个Object的最新状态中提取一些细节。StateObject

在显示此信息的页面上,用户可以输入一些评论,从而创建一个新的State. 创建新的 后State,我立即拉出ObjectfromObjectDisplay并将其发送回以放入局部视图并替换Object页面上网格中的 。

// Add new State.
db.States.Add(new State()
{
    ObjectId = objectId,
    Comments = comments,
    UserName = username
});

// Save the changes (executes all of the above).
db.SaveChanges();

// Return the new Object information.
return db.Objects.Single(c => c.ObjectId == objectId);

根据我的数据库跟踪,Single调用发生在调用后大约 70 毫秒SaveChanges,并且它发生在同一个 SPID 上。

现在解决问题: 数据库默认值RecordDatein Stateto GETUTCDATE()- 我自己不提供日期。我看到的是Object返回的有StateRecordDateState和旧Comments的新State信息State 我看到Object返回的有 oldState的信息。当我刷新页面时,所有正确的信息都在那里,但在数据库/EF 的初始调用中返回了错误的信息。

所以..有什么问题?视图更新速度不够快吗?EF会发生什么事情吗?我真的不知道从哪里开始寻找。

4

2 回答 2

1

如果您之前在相同Object的 中加载了相同的实体DbContext,EF 将返回具有陈旧值的缓存实例,并忽略从 SQL 返回的值。

最简单的解决方案是在返回之前重新加载实体:

var result = db.Objects.Single(c => c.ObjectId == objectId);
db.Entry(result).Reload();
return result;
于 2013-03-22T16:29:25.843 回答
0

这确实很奇怪。在 SQL Server 中,视图默认情况下不会持久化,因此会立即显示基础数据中的更改。您可以在视图上创建聚集索引,有效地持久化查询,但在这种情况下,数据会同步更新,因此您应该立即看到更改。

如果您正在使用快照隔离级别,您的更改可能不会立即对其他 SPID 可见,但由于您在同一个 SPID 上并且不使用快照隔离,这也不是罪魁祸首。

此时唯一剩下的就是应用层了。您实际上是在调用堆栈中较高的位置使用 Single 调用的结果,还是在某处丢失了。我假设页面的刷新使用不同的代码路径,这可以解释为什么它在那里工作。

于 2013-03-21T21:24:42.540 回答