Entity framework 基于代理的更改跟踪,POCO对象中的属性未更新
我首先在ASP.NET MVC应用程序中使用基于代理的更改跟踪的EF5代码。 我的一个域类包含一个经常更新的数值属性。因此,此属性不会使用框架持久化到数据库:Entity framework 基于代理的更改跟踪,POCO对象中的属性未更新,entity-framework,ef-code-first,change-tracking,Entity Framework,Ef Code First,Change Tracking,我首先在ASP.NET MVC应用程序中使用基于代理的更改跟踪的EF5代码。 我的一个域类包含一个经常更新的数值属性。因此,此属性不会使用框架持久化到数据库: public virtual int CurrentSessions { get { return _currentSessions; } set { Interlocked.Exchange(ref _currentSessions, value); }
public virtual int CurrentSessions
{
get
{
return _currentSessions;
}
set
{
Interlocked.Exchange(ref _currentSessions, value);
}
}
我面临的问题是,属性的值不会在会话之间更新。我的API控制器根据内部逻辑增加或减少上述值,如下所示:
myObj.CurrentSessions++;
或
其中,myObj是在每个会话中通过LINQ从上下文检索的代理对象:
var myObj = objectContext.Instances<myPocoEntity>().FirstOrDefault(cb => cb.SomeProp == someValue);
当我在myObj.CurrentSessions的值增加/减少后检查它时,它确实会被更新,但在下一个服务器请求中,当再次检索myObj时,CurrentSessions始终具有其初始值零
如何确保在不扫描整个上下文的情况下更新POCO实体中的属性值?如果我正确理解您的问题,您有单独的DbContext对象,并且当一个更新对象时,另一个在数据库中的下一个对象请求之前不会看到更改 如果是这样,您可以通过DbEntityEntry类重新加载有问题的对象 然后,您可以使用Reload方法或GetDatabaseValues方法来获取数据库中当前存在的值 例子
// Reload Usage
context.Entry(entity).Reload();
// GetDatabaseValues Usage
DbPropertyValues propertyValues = context.Entry(entity).GetDatabaseValues();
foreach (DbPropertyValue val in propertyValues)
{
...
}
我要澄清一下:我说的是一个ObjectContext实体,而不是DbContext实体,尽管有许多这样的不同实体,我正在跨不同的ASP.NET MVC操作更新这些实体。考虑到多个客户端发出打开和关闭请求,它们相应地增加和减少计数器。我的问题是,一个会话中对计数器值的更改没有反映在下一个会话中,即访问相同但已代理的计数器属性。
// Reload Usage
context.Entry(entity).Reload();
// GetDatabaseValues Usage
DbPropertyValues propertyValues = context.Entry(entity).GetDatabaseValues();
foreach (DbPropertyValue val in propertyValues)
{
...
}