2012-03-17 2 views
3

Я использую C#, .NET (4.0) и Entity Framework для подключения к SQL CE 4.0.C# Entity Framework Linq Query не распознает новые изменения

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

Пример:

var query = from location in mainDBContext.Locations 
      where location.InUse == true 
      select location; 

Этот запрос возвращает также объекты, где location.InUse = ложь, если InUse было верно, когда загружен из БД, а затем изменены позже в коде.

Это захват экрана из одного из объектов результатов запроса.

enter image description here

Я действительно не понимаю, почему он это делает. Я бы понял, будет ли этот запрос всегда запрашивать базу данных, и я бы получил более старую версию этого объекта (таким образом, InUse будет true).

Благодарим вас за ваше время и ответы.

ответ

3

Вот как EF работает внутри.

Каждый объект, однозначно идентифицированный его ключом, может отслеживаться контекстом только один раз - that is called identity map. Поэтому неважно, сколько раз вы выполняли запрос. Если запрос возвращает отслеживаемые сущности и если он выполняется повторно в одном экземпляре контекста, он всегда возвращает тот же экземпляр.

Если экземпляр был изменен в приложении, но не сохранен в базе данных, ваш запрос будет выполнен в базе данных, где будет сохраняться состояние с сохранением, но процесс материализации по умолчанию будет использовать текущие данные из приложения вместо данных, извлеченных из базы данных. Вы можете заставить запрос вернуть состояние из базы данных (установив mainDBContext.Locations.MergeOption = MergeOption.OverwriteChagens), но из-за карты идентификации ваши текущие изменения будут потеряны.

+0

Благодарим вас за ответ. Можно ли выполнить запрос по локальным данным? – Ben

+2

[Да, возможно] (http://stackoverflow.com/questions/8210267/entityframeworks-object-cahe-getting-already-retieved-objects/8210523#8210523). –

1

Я не совсем уверен, что именно ваша проблема, но я думаю, что вы должны знать это:

  • Такой запрос всегда возвращает данные, представленные в БД. Когда вы меняете некоторые объекты в своем коде, но они не отправляются в базу данных, запрос LINQ будет запрашивать данные из базы данных без изменений вашего кода.

  • Запросы LINQ используют отсроченное выполнение, поэтому ваша переменная query не является списком результатов, это просто определение запроса, которое оценивается каждый раз, когда нужны результаты. Вы должны добавить .ToList(), чтобы оценить этот запрос и получить список результатов в этой определенной строке кода.

Пример для .ToList():

var query = (from location in mainDBContext.Locations 
       where location.InUse == true 
       select location).ToList(); 
1

Я просто столкнулся с тем же. Это немного грязно, но другой вариант - изучить локальный кеш.Вы можете сделать это, например:

var query = from location in mainDBContext.Locations.Local 
      where location.InUse == true 
      select location; 

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

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