6

Есть ли альтернатива использованию Include для загружаемых объектов?Что я могу использовать вместо Include?

Причина, по которой я не могу использовать Include, заключается в том, что она появляется, чтобы быть чувствительным к регистру.
Рассмотрим следующий пример:
У меня есть две таблицы:

enter image description here

enter image description here

Примечания разница в случае.

Когда я хочу нетерпеливый нагрузки Sager «s Stamkartotek Я использую Include, но Include не загружается Stamkartotek:

enter image description here

** Update 1 **

Я заметил это странное поведение - если I использовать любые поля от Stamkartotek, он правильно соединяется: enter image description here

Но если я пойду и только получить значение Stam_nr вместо всего объекта - это дает мне A вместо a:

enter image description here

исследований до сих пор:

  • Команда EF knows об этой проблеме - но решила не исправлять ее.
  • This guy имеет ту же проблему только с помощью кода первого - никакое решение не было найдено

Update 2
SQL genereted с Include:

FROM [dbo].[Sager] AS [Extent1] 
INNER JOIN [dbo].[Stamkartotek] AS [Extent2] ON [Extent1].[Klient_Stam_nr] = [Extent2].[Stam_nr] 
WHERE 'jek15' = [Extent1].[Sags_nr] 

Update 3
Загрузка их в отдельных запросах, и позволяя changetracker фиксировать ссылку. Это, кажется, не работает, либо:
enter image description here

+0

Сообщение форума MSDN устарело. Вы проверили, исправили ли они это в более поздних версиях EF? Если они есть, вы должны обновить версию EF до той, которая исправляет проблему. Не ожидайте, что исправления будут перенесены в предыдущие версии EF, особенно версии, такие как старые версии 4.1. –

+0

@PanagiotisKanavos. Я попытался создать мою модель с помощью [EF 6.0.1] (http://entityframework.codeplex.com/releases/view/112029), но проблема все еще существует: | –

+0

Тогда вам, вероятно, следует заменить столбцы, которые вы используете для связи с ints. Проблема заключается не в 'Include', а в генераторе SQL, когда ассоциации используют текстовые поля. В любом случае использование текстовых данных для ключей является необычной практикой (по причинам, которые вы только что встретили). Или вы можете загрузить EF-код (это OSS) и исправить его, если у вас есть время ... –

ответ

1

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

При использовании linq запрос будет выполняться в базе данных при вызове ToList() или First, например. Если вы используете Include, запрос будет загружать данные, когда вызывается какое-то из этих действий.

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

Я предлагаю: Обновление таблиц, которые вы используете с помощью целых ключей, и использовать левое внешнее соединение, если вы хотите загрузить связанные данные. Иногда лучше использовать старый добрый tsql (вы также можете сделать левое внешнее соединение в linq).

+0

Благодарим вас за участие :) К сожалению, я не могу [сделать сопоставление использования EF] (http://stackoverflow.com/q/14631035/1244816) becuase он не поддерживается: | Мне нужен EF для changetracking, поэтому я не могу справиться с SQL. Изменение таблицы для использования 'int' вместо' strings' является хорошей идеей :), но это основная таблица старой системы, и я не смею ее менять: s –

3

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

И делать вставки и удаления с помощью хранимых процедур

Вы можете отслеживать и проголосовать за вопрос, чтобы решить здесь:

String comparison differences between .NET and SQL Server cause problems for resolving FK relationships in the state manager

+0

Я не сомневаюсь, что это предложение будет работать, однако мой вопрос - грубое упрощение моей реальной проблемы. В моей программе есть * много * мест, где это нужно было бы сделать - поэтому я надеялся на меньшее «громоздкое» решение –

+0

Вы получаете щедрость за то, что указали мне на официальный ответ об ошибке - спасибо :) –

1

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

+0

Нужна ли мне делать что-нибудь еще, просто загружая объекты? Я не могу заставить его работать - я обновил свой вопрос. (обновление 3) –

+0

Я просто попробовал, и вы правы - это не сработает. Я думаю, что это использует ту же логику, что и .Include, чтобы найти отношения. Я думал, что вы можете «исправить» ключи в событии '.ObjectMaterialized', но это тоже не сработает. Не можете ли вы обновить данные в базе данных, чтобы корпус был таким же? – Pawel

+0

Это правильно обходное решение, которое мы должны использовать. Спасибо, за ваш вклад –