C # Entity Framework Linq Query не распознает новые изменения - PullRequest
3 голосов
/ 17 марта 2012

Я использую C #, .NET (4.0) и Entity Framework для подключения к SQL CE 4.0.

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

Пример:

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

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

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

enter image description here

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

Спасибо за ваше время и ответы.

Ответы [ 3 ]

3 голосов
/ 17 марта 2012

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

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

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

1 голос
/ 06 сентября 2013

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

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

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

1 голос
/ 17 марта 2012

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

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

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

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

var query = (from location in mainDBContext.Locations
                 where location.InUse == true
                 select location).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...