10

データベース内のオブジェクトの更新に問題があります。私は 2 台の PC と 2 つのアプリケーションを持っています。

最初の 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 には異なる接続文字列があります (同じ DB に対して異なるアカウント)。

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

もう 1 つの可能性は、MergeOption を使用して、コンテキスト内のオブジェクトをどのように管理するかを決定することです。たとえばMergeOption.OverwriteChanges、オブジェクト コンテキストをデータ ソースの値で上書きします。

詳細については、http://msdn.microsoft.com/en-us/library/system.data.objects.mergeoption.aspx を参照してください。

于 2012-08-12T18:52:12.173 に答える