Entity framework 基于代理的更改跟踪,POCO对象中的属性未更新

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); }

我首先在ASP.NET MVC应用程序中使用基于代理的更改跟踪的EF5代码。 我的一个域类包含一个经常更新的数值属性。因此,此属性不会使用框架持久化到数据库:

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)
{
    ...
}