Entity Framework - обновлять объекты из базы данных - PullRequest
10 голосов
/ 02 апреля 2010

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

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

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

Ответы [ 3 ]

9 голосов
/ 02 апреля 2010

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

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

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

8 голосов
/ 08 июня 2012

Начиная с 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 голосов
/ 12 августа 2012

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

Для получения дополнительной информации см. http://msdn.microsoft.com/en-us/library/system.data.objects.mergeoption.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...