我在ASP.NET MVC应用程序中使用EF5代码优先于基于代理的更改跟踪。 我的一个域类包含一个非常频繁更新的数字属性。因此,此属性不会使用框架持久保存到数据库:
public virtual int CurrentSessions
{
get
{
return _currentSessions;
}
set
{
Interlocked.Exchange(ref _currentSessions, value);
}
}
我面临的问题是,不会在会话中更新属性的值。根据内部逻辑,我的API控制器要么增加上面的值,要么减少它,如下所示:
myObj.CurrentSessions++;
或
myObj.CurrentSessions--;
其中myObj是在每个会话中通过LINQ从上下文检索的代理对象:
var myObj = objectContext.Instances<myPocoEntity>().FirstOrDefault(cb => cb.SomeProp == someValue);
当myObj.CurrentSessions增加/减少后检查它的值时,它确实已更新,但在下一个服务器请求中,当再次检索myObj时,CurrentSessions始终为其初始值零。
如何确保在POCO实体中更新属性值而不扫描整个上下文以进行更改?
答案 0 :(得分:0)
如果我正确理解你的问题,你有单独的DbContext对象,当一个人更新一个对象时,另一个人在数据库中对象的下一次请求之前没有看到这些变化?
如果是这样,您可以通过DbEntityEntry类重新加载有问题的对象。
然后,您可以使用“Reload()”方法或“GetDatabaseValues()”方法来获取数据库中当前存在的值。
实施例(多个)
// Reload Usage
context.Entry(entity).Reload();
// GetDatabaseValues Usage
DbPropertyValues propertyValues = context.Entry(entity).GetDatabaseValues();
foreach (DbPropertyValue val in propertyValues)
{
...
}