實體框架 - 從數據庫刷新對象

database entity-framework objectcontext wpf

我在刷新數據庫中的對象時遇到問題。我有兩個PC和兩個應用程序。

在第一台PC上,有一個與我的數據庫通信的應用程序,並將一些數據添加到Measurements表中。在我的另一台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中有不同的連接字符串(同一個數據庫的不同帳戶)。

一般承認的答案

這應該工作:

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

它還可以在每次調用時查找數據庫,但操作更少。


熱門答案

從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



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因