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