2012-02-29 1 views
2

В базе данных у меня есть таблицы Reservations и OldReservations, где OldReservations является копией (таблицы Reservations) и используется для хранения старых резерваций. Вот шаги, которые я сделал для создания TPC наследования:Почему при использовании наследования TPC выбирается запрос с использованием левого внешнего соединения?

1) Я производный OldReservation сущности от Reservations субъекта
2) Я удалил пересекающиеся свойства от OldReservations сущности
3) Я тогда очерчен OldReservations полой таблицы в XML-в EDMX файл

Но когда я бегу folllowing запрос, сгенерированный SQL использует LEFT OUTER JOIN, который не имеет смысла, так как это означает, что запрос будет возвращать только строки из таблицы OldReservations где Reservations.ReservationID == OldReservations.ReservationID. Из статей, которые я читал, кажется, что приведенный выше запрос должен использовать оператор UNION, а не LEFT OUTER JOIN:

 var reservations = context.Reservations; 
     foreach (var item in reservations); 

Сгенерированный SQL:

SELECT CASE 
     WHEN (NOT (([Project1].[C1] = 1) 
        AND ([Project1].[C1] IS NOT NULL))) THEN '0X' 
     ELSE '0X0X' 
     END       AS [C1], 
     [Extent1].[ReservationID] AS [ReservationID], 
     [Extent1].[ReservationDate] AS [ReservationDate], 
     [Extent1].[ContactID]  AS [ContactID], 
     [Extent1].[EventID]   AS [EventID], 
     [Extent1].[RowVersion]  AS [RowVersion] 
FROM [dbo].[Reservations] AS [Extent1] 
     LEFT OUTER JOIN (SELECT [Extent2].[ReservationID] AS [ReservationID], 
           cast(1 as bit)   AS [C1] 
         FROM [dbo].[OldReservations] AS [Extent2]) AS [Project1] 
     ON [Extent1].[ReservationID] = [Project1].[ReservationID] 

TPC выберите запрос с использованием левого внешнего соединения Безразлично «Имеет смысл, так что я делаю неправильно при создании наследования TPC?

спасибо

+1

Это похоже на запрос для наследования TPT. –

+0

Извините, я не заметил вашего ответа. Я не уверен, к чему вы клоните? – user702769

ответ

2

Вот как TPC должен работать. Reservation - это конкретный тип, поэтому свойства в Reservation хранятся в таблице Reservations. OldReservation также является конкретным типом, поэтому свойства в OldReservation, которые еще не отображены, хранятся в таблице OldReservations.

То, что вы хотите, похоже, но не совсем то же самое. Сделайте Reservation абстрактным шрифтом и переименуйте его в ReservationBase. Затем создайте производный тип Reservation. Теперь OldReservation больше не происходит от конкретного типа, поэтому все OldReservation собственные свойства и унаследованные свойства будут отображаться в таблице OldReservations.

После этого yourContext.ReservationBases можно использовать, чтобы получить как Reservations и OldReservations, и что следует использовать UNION (ALL).

+0

Я переименовал резервирование в базу резервирования -> изменил его на абстрактный тип -> создал производный тип резервирования -> и сопоставил этот производный тип с таблицей резервирования. Но теперь я получаю сообщение об ошибке «EntityTypes BAModel.OldReservation, BAModel.Reservation сопоставляются с одними и теми же строками в таблице Reservations. Условия сопоставления могут использоваться для различения строк, для которых эти типы сопоставляются». Из ошибки кажется, что EF пытается сопоставить объект OldReservation с таблицей Reservations вместо таблицы OldReservations ?! Единственный вариант использования условия отображения или есть обходное решение? – user702769

+1

@ user702769 Ваш «OldReservation» по-прежнему происходит из «Резервации»? Если это так, то этого не следует, оно должно происходить из 'ReservationBase'. – hvd

+1

@ user702769 Другая возможность, убедитесь, что 'ReservationBase' не сопоставляется ни с одной таблицей. Должны быть только «Резервация» и «Старая реставрация». – hvd

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