1

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

4

1 回答 1

0

如果我正确理解您的问题,您有单独的 DbContext 对象,当一个对象更新一个对象时,另一个对象在下一次请求数据库中的对象之前不会看到更改?

如果是这样,您可以通过 DbEntityEntry 类重新加载有问题的对象。

然后,您可以使用“Reload()”方法或“GetDatabaseValues()”方法来获取数据库中当前存在的值。

例子)

// Reload Usage
context.Entry(entity).Reload();


// GetDatabaseValues Usage
DbPropertyValues propertyValues = context.Entry(entity).GetDatabaseValues();
foreach (DbPropertyValue val in propertyValues)
{
    ...
}
于 2012-12-23T22:13:34.857 回答