10

我在刷新数据库中的对象时遇到问题。我有两台 PC 和两个应用程序。

在第一台 PC 上,有一个应用程序与我的数据库通信并将一些数据添加到测量表中。在我的另一台 PC 上,有一个应用程序可以在计时器下检索最新的测量值,因此它也应该检索由我的第一台 PC 上的应用程序添加的测量值。

问题是它没有。在我的应用程序启动时,它会缓存数据库中的所有数据,并且永远不会添加新数据。我使用 Refresh() 方法,当我更改任何缓存数据时效果很好,但它不会刷新新添加的数据。

这是我应该更新数据的方法:

    public static Entities myEntities = new Entities();

    public static Measurement GetLastMeasurement(int conditionId)
    {
        myEntities.Refresh(RefreshMode.StoreWins, myEntities.Measurements);

        return (from measurement in myEntities.Measurements
                where measurement.ConditionId == conditionId
                select measurement).OrderByDescending(cd => cd.Timestamp).First();
    }

PS 应用程序在 app.config 中有不同的连接字符串(同一数据库的不同帐户)。

4

3 回答 3

9

这应该有效:

public static Entities myEntities = new Entities();

public static Measurement GetLastMeasurement(int conditionId)
{
    myEntities.Refresh(RefreshMode.StoreWins, myEntities.Measurements);
    var allMeasurements = myEntities.Measurements.ToList();//retrieves all measurements from database

    return (from measurement in allMeasurements
            where measurement.ConditionId == conditionId
            select measurement).OrderByDescending(cd => cd.Timestamp).First();
}

当您每次想要使用它时刷新存储时,缓存有什么意义?您可以将其更改为:

public Measurement GetLastMeasurement(int conditionId)
{
    var entities = new Entities();
    return (from measurement in entities.Measurements
            where measurement.ConditionId == conditionId
            select measurement).OrderByDescending(cd => cd.Timestamp).First();
}

它还会在每次调用时在数据库中查找,但操作要少得多。

于 2010-04-02T09:04:16.560 回答
8

从 EF 4.1 开始,您可以在实体上使用 AsNoTracking() 方法。

return myEntities.Measurements.AsNoTracking();

请注意, AsNoTracking() 不会将实体添加到您的上下文中进行跟踪,而只会从您的数据存储中返回它们。

有关详细信息,请参阅http://blogs.msdn.com/b/adonet/archive/2011/02/05/using-dbcontext-in-ef-feature-ctp5-part-11-load-and-asnotracking.aspx

于 2012-06-08T10:26:57.527 回答
3

另一种可能性是使用 MergeOption 来决定您希望如何管理上下文中的对象。例如MergeOption.OverwriteChanges,将使用数据源中的值覆盖对象上下文。

有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/system.data.objects.mergeoption.aspx

于 2012-08-12T18:52:12.173 回答