0

Я использую запрос Linq для извлечения сущностей с SQL-сервера с использованием Entity Framework. Когда я обновляю entitiy, EF кэширует результат. Я подозреваю, что это потому, что ObjectContext находится в статической переменной (ниже). Единственный способ обновить данные, используя мой код ниже, - вызвать метод и установить _db на null, когда могут отображаться устаревшие данные (например: в GridView). Есть ли способ просто предотвратить его кэширование или добавить какого-то обработчика запросов для вызова этого метода на моем уровне данных вместо того, чтобы обнаруживать, когда могут отображаться устаревшие данные?Результаты кэширования в статической переменной

private static ServiceEntities _db; 
protected static ServiceEntitiesDb 
    { 
     get 
     { 
      if (_db == null) 
      { 
       _db = new ServiceEntities(); 
       _db.Contacts.MergeOption = MergeOption.OverwriteChanges; // failed 
      } 
      return _db; 
     } 
    } 

    public static IEnumerable<Contact> GetContactsByName(string name) { 
     var items = Db.Contacts; 
     var filteredName = items.Where(i => (i.Name??string.Empty).IndexOf(name) >=0); 
     return filteredName; 
    } 
+0

Есть ли конкретная причина, о вы делаете контекстный объект статический? – Jorge

+0

Поэтому мне не нужно воссоздать его и обернуть каждый метод блоком 'using'. – Echilon

+0

Но вы можете использовать переменную без использования. На самом деле я всегда использую DBContext, но не статический, и переопределяю метод dispose, чтобы избежать проблем с производительностью. Причина для кеширования заключается в том, что '_db' является статической переменной, и вы экземпляр ссылки только один раз, сохраняя ссылку в течение всего цикла цикла – Jorge

ответ

0

Немного подробное решение (которое я хотел избежать) заключается в том, чтобы обернуть его в используемый блок. То есть:

public static IEnumerable<Contact> GetContactsByName(string name) { 
     var items = Db.Contacts; 
     var filteredName = items.Where(i => (i.Name??string.Empty).IndexOf(name) >=0); 
     return filteredName; 
} 

Становится

public static IEnumerable<Contact> GetContactsByName(string name) { 
    using (var db = new SomeContext()) { 
     var items = db.Contacts; 
     var filteredName = items.Where(i => (i.Name??string.Empty).IndexOf(name) >=0); 
     return filteredName; 
    } 
} 
Смежные вопросы