Entity Framework: LINQ Include () не работает после обновления БД, почему? - PullRequest
4 голосов
/ 22 января 2010

Я новичок в Entity Framework и LINQ и столкнулся с довольно странным сценарием.

Я использовал следующий запрос для возврата информации об учетной записи:

var account = ((from acct in _entities.Account
                        join m in _entities.Item on acct.Id equals m.Account.Id
                        where acct.Id == accountId && m.ItemNumber.EndsWith(itemNumber)
                        select acct) as ObjectQuery<Account>).Include("Item.ItemDetails");

Недавно мы внесли некоторые изменения в базу данных и создали новый файл edmx. После изменения вышеуказанный запрос по-прежнему возвращает учетную запись и связанный элемент, но ItemDetails больше не включается.

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

Кроме того, я не вижу отличия муравья в файле edmx между объектами Item и ItemDetails, так как они не были изменены, и свойство навигации там.

Кто-нибудь видел это раньше?

Спасибо

Ответы [ 2 ]

1 голос
/ 28 февраля 2010

У вас есть один из двух возможных сценариев:

  1. Item имеет отношение к Account (выражается в вашей Entity Model как EntityAssociation и в DB в качестве внешнего ключа):

  2. Нет никакой связи между Item set и Account set, поэтому вы должны указать соединение в LINQ, как вы это сделали.

Случай 1: если это так, то вам не нужен оператор соединения ... выбрав Acount.Item, вы получите все элементы, где Item.AccountID равен Account.ID

Итак, ваше заявление о присоединении: join m in _entities.Item on acct.Id equals m.Account.Id в основном сказал Item вернуться на Account, чтобы проверить ID. Если бы они еще не были подключены, то вы не могли бы получить m.Account.ID

Случай 2. Если между Account и Item нет никакой связи, то .Include() определенно не будет работать, поскольку навигационное свойство НЕ существует в вашей модели.

Вывод: проверьте вашу новую модель, чтобы увидеть, существует ли связь между Account и Item. Если да, то удалите Регистрация. Если нет отношений, значит, вы сделали что-то не так.

Вот оператор выбора, предполагающий сценарий 1 и который Account.Item не является коллекцией:

var account = from acct in _entities.Account.Include("Item.ItemDetails")
              where acct.Id == accountId && acct.Item.ItemNumber.EndsWith(itemNumber)
              select acct;
1 голос
/ 25 января 2010

В поле «Включить (...)» используется имя свойства навигации, поэтому будет полезно проверить точное имя свойства из .edmx (особенно, если оно единственное или множественное).

Также вы можете попробовать изменить запрос следующим образом:

var account = from acct in _entities.Account.Include("Item.ItemDetails")
              join m in _entities.Item 
                  on acct.Id equals m.Account.Id
              where acct.Id == accountId && m.ItemNumber.EndsWith(itemNumber)
              select acct;
...