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