2013-09-12 2 views
1

Каков наилучший способ обновления данных в Entity Framework 5? У меня есть приложение WPF, показывающее статистику из базы данных, где данные все время меняются. Каждые 10 секунд приложение обновляет результат, но поведение по умолчанию для EF, похоже, кэширует предыдущие результаты. Таким образом, я хотел бы сделать способ аннулировать предыдущие результаты, чтобы можно было загрузить новый набор данных.Лучшая практика обновления EF5 из базы данных

Контекст интерес определяется следующим образом:

public partial class MyEntities: DbContext 
{ 
    ... 
    public DbSet<Stat> Stats { get; set; } 
    ... 
} 

После некоторого чтения мне удалось найти несколько подходов, но я понятия не имею о том, как эффективнее эти пути, и если они приходят с отрицательные стороны.

  • Создать новый экземпляр объекта сущностей

    using (var db = new MyEntities()) 
    { 
        var stats = from s in db.Stats ... 
    } 
    

    Это работает, но чувствует себя неэффективным, потому что есть много других мест, где извлекаются данные, и я не хочу, чтобы вновь открыть новое соединение каждый Мне нужны некоторые данные. Не было бы более эффективным поддерживать связь открытым и делать это по-другому?

  • Вызов refresh на ObjectContext

    var stats = from s in db.Stats ... 
    ObjectContext.Refresh(RefreshMode.StoreWins, stats); 
    

    Это также предполагает, что я извлечения ObjectContext из DbContext таким образом:

    private MyEntities db = null; 
    private ObjectContext ObjectContext 
    { 
        get 
        { 
         return ((IObjectContextAdapter)db).ObjectContext; 
        } 
    } 
    

    Это решение я использую, как это Теперь. Это кажется простым. Но я где-то читал, что ObjectContext в настоящее время не доступен непосредственно в DbContext, потому что команда EF не думает, что кому-то это понадобится, и что вы можете делать все, что вам нужно непосредственно в DbContext. Это заставляет меня думать, что, возможно, это не лучший способ сделать это, или?

  • Я знаю, что существует метод reloaddbContext.Entry, но поскольку я не перезагружаю единый объект, а получаю список сущностей, я действительно не знаю, будет ли этот способ работать. Если я получу 5 объектов stat в первом запросе, сохраните их в списке и сделайте reload на них, когда придет время для обновления, я могу пропустить другие, которые были добавлены в список в базе данных. Или я полностью неправильно понял метод reload? Могу ли я сделать перезагрузку на DbSet, указанном в MyEntities?

Есть целый ряд вопросов, указанных выше, но то, что я в основном хочу знать , что является лучшей практикой в ​​EF5 для задавать тот же запрос к базе данных снова и снова? Это вполне может быть что-то, что я еще не обнаружил ...

ответ

1

На самом деле, и даже если это кажется противоречащим интуитивным, первый вариант является правильным, см this

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

Именно поэтому EF работает так «естественно» с ASP.NET MVC, так как при каждом запросе создается экземпляр DbContext.

Это не означает, что вы должны создать DbContext повсюду, конечно, в вашем контексте, используя DbContext за операции обновления (тот, происходит каждые 10secs), кажется, достаточно хорошо, если во время этой операции вам нужно будет удалите определенную строку, например, вы передадите DbContext, а не создадите новую.

+1

После того, как вы прочли свою ссылку и некоторые другие ссылки, я начинаю понимать больше, почему было бы лучше не хранить экземпляр DbContext слишком долго. Я не знал, что он кэширует все изменения, и это может быть довольно много в приложении, которое работает весь день. Спасибо за ваш ответ ... – Ohlin

+0

@ Охлин мое удовольствие, трюк ума, который я люблю использовать с DBContext, заключается в том, чтобы думать о его использовании, поскольку это был запрос на действие ASP.NET MVC, даже в WPF, помогает получить хорошая идея использования области применения одного объекта DbContext. –

+0

Это звучит как хороший «трюк ума» ... – Ohlin

Смежные вопросы