Entity Framework - обновлять объекты из базы данных

У меня возникают проблемы с обновлением объектов в моей базе данных. У меня есть два компьютера и два приложения.

На первом ПК есть приложение, которое связывается с моей базой данных и добавляет некоторые данные в таблицу Measurements. На моем другом ПК есть приложение, которое извлекает последнее измерение под таймером, поэтому оно должно извлекать измерения, добавленные приложением на моем первом ПК.

Проблема в том, что это не так. При запуске приложения он кэширует все данные из базы данных и никогда не добавляет новые данные. Я использую метод 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();
    }

P.S. Приложения имеют разные строки подключения в app.config(разные учетные записи для одного и того же БД).

Ответ 1

Это должно работать:

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

Он также ищет в базе данных каждый вызов, но делает гораздо меньше операций.

Ответ 2

Начиная с 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

Ответ 3

Другая возможность - использовать MergeOption, чтобы решить, как вы хотите управлять объектами в контексте. Например, MergeOption.OverwriteChanges перезапишет контекст объекта значениями из источника данных.

Подробнее см. http://msdn.microsoft.com/en-us/library/system.data.objects.mergeoption.aspx