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

时间:2012-12-23 21:42:48

标签: entity-framework ef-code-first change-tracking

我在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实体中更新属性值而不扫描整个上下文以进行更改?

1 个答案:

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