(недостаточно места в разделе комментариев)
Я провел несколько тестов.
Дело в том, что вы в порядке, пока вы ТОЛЬКО указываете подтип, который запрашиваете (например, «Адрес» в вашем случае).
Но если вы запрашиваете базовый тип (даже если вам не нужна информация о подтипах), напр. только ContactPossibility.ID, сгенерированный SQL объединит все таблицы подтипов.
Таким образом, запрос вашей «отслеживаемой» коллекции ContactPossabilities может создать проблему производительности.
Я попытался обойти эту проблему, отключив базовую сущность и разделив унаследованные сущности на их собственную таблицу + общую таблицу, по сути, преобразовав TPT в TPC: это сработало нормально с концептуальной точки зрения (после большого редактирования edmx) ,
Пока я не понял, что это глупо ... :) Действительно, в этом случае вам всегда нужно объединять все базовые таблицы для запроса общих данных ...
(Хотя я не уверен в случае, описанном в конце этого поста, не пытался его проверить)
Так что я думаю, так как в основном мне нужно будет запросить конкретный тип (человек, компания, адрес, телефон, ...), сейчас все будет в порядке, и надеюсь, что MS исправит EF4.5.
Так что мне нужно быть осторожным при запросе, еще один интересный пример:
Допустим, вы хотите выбрать человека, а затем запросить его адрес, что-то вроде (пытался следовать вашему имени):
var person = from b in context.ContactEntities.OfType-Person-()
where b.FirstName.StartsWith("X")
select b;
var address = from a in context.ContactPossibilities.OfType-Address-()
where **a.ContactEntity == person.FirstOrDefault()**
select a;
это создаст объединение между всеми таблицами производных сущностей Contact и проблемами производительности: сгенерированный SQL принимает таблицу ContactPossibility и присоединяется к Address по ContactPossibilityID, затем объединяет объединение всех производных таблиц Contact, соединенных с базовой таблицей Contact , прежде чем, наконец, присоединиться к отфильтрованной таблице Person.
Однако рассмотрим следующую альтернативу:
var person = from b in context.ContactEntities.OfType-Person-()
where b.FirstName.StartsWith("X")<BR>
select b;
var address = from a in context.ContactPossibilities.OfType-Address-()
where **a.ContactID == person.FirstOrDefault().ID**
select a;
Это будет работать нормально: сгенерированный SQL принимает таблицу ContactPossibility и присоединяется к Address на ContactPossibilityID, а затем присоединяется к отфильтрованной таблице Person.
Mike.