Entity Framework 4.1 - TPT Eager Loading - «ResultType указанного выражения несовместим с требуемым типом» - PullRequest
3 голосов
/ 30 мая 2011

У меня есть модель с наследованием TPT.

  • Местоположение ( аннотация )
  • Улица ( производное из местоположения)
  • GoogleStreetView (1 Улица -> 0..1 GoogleStreetView )

У каждого из вышеперечисленных есть своя таблица.

Все работало нормально, пока я не добавил таблицу "GoogleStreetView" (которая поддерживается PK / FK для Street).

Когда я пытаюсь это сделать:

var street = _locationRepository
   .Find()
   .OfType<Street>()
   .Include(x => x.GoogleStreetView)
   .SingleOrDefault(x => x.LocationId == 1);

Я получаю сообщение об ошибке:

ResultType указанного выражения несовместим с требуемым типом.Выражение ResultType имеет вид «Transient.reference [xxxx.Repositories.SqlServer.Location]», но обязательный тип - «Transient.reference [xxxx.Repositories.SqlServer.Street]».Имя параметра: arguments [0]

Что за ...?

Затем я нашел этот поток , который в основном утверждает, что это ошибка с EF 4 (и EF 4.1 RTM, судя по всему).

Я не понимаю обходного пути «использовать независимую ассоциацию, без поддержки FK».

Я использую шаблон Repository / UoW, поэтому мой LocationRepository имеет доступ только к ObjectSet<Location>.Поэтому я не могу выполнять явные объединения в запросах LINQ.

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

Может кто-нибудь пролить свет на это и предложить решение?

1 Ответ

3 голосов
/ 30 мая 2011

Хорошо, я нашел один обходной путь.

И это должно перевернуть ФК.

Так что вместо:

1 Улица -> 0..1 GoogleStreetView

Что правильно, теперь у меня есть:

* Улица -> ** 0..1 GoogleStreetView

Так что теперь Улица имеет обнуляемый FK, указывающий на GoogleStreetView.

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

Но это похоже на единственный правильный обходной путь.

Похоже, что EF не поддерживает ассоциации 1 - 0..1, поддерживаемые комбинацией PK / FK.

Недопустимо, если вы спросите меня. Если они знали, что это ошибка в EF 4.0, почему они не исправили ее в 4.1 ???

EDIT

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

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

...