Entity Framework 5: сопоставление таблиц и типов с конкретным базовым классом

Я работаю над приложением EF5 Code First, и до сих пор все шло хорошо, но я столкнулся с проблемой, и я надеюсь, что кто-то может предложить решение.

По сути, у меня есть базовый класс и несколько производных классов, и мне интересно, как обрабатывать их сопоставление. Вот смехотворно упрощенный пример:

[Table("Person")]
public class Person
{
  public int PersonId { get; set; }
  public string Name { get; set; }
}

[Table("EmployeePerson")]
public class EmployeePerson : Person
{
  public int HoursWorked { get; set; }
}

[Table("CustomerPerson")]
public class CustomerPerson : Person
{
  public int DollarsSpent { get; set; }
}

Пока что это типичный сценарий Table-per-Type, за исключением того, что базовый класс не является абстрактным — возможно иметь Person, который не является EmployeePerson или CustomerPerson. У меня возникли проблемы с тем, чтобы EF принял это, и когда я пытаюсь загрузить такой объект по идентификатору, уродливый запрос, сгенерированный EF, не возвращает строк.

Кто-нибудь реализовывал что-то подобное раньше? Всегда ли отображение в стиле TPT требует, чтобы базовый класс был абстрактным? Я не смог найти ни одного примера обратного, но и реального подтверждения. Я могу придумать несколько уродливых обходных путей, которые я мог бы использовать, если бы мне пришлось, но я бы предпочел более элегантное решение, если оно есть.

(Еще одна загвоздка: я работаю со сторонней базой данных, поэтому не могу внести какие-либо изменения в схему.)

Спасибо!


person Jeremy Todd    schedule 11.04.2013    source источник


Ответы (1)


Если ваше «уродливое» решение состоит в том, чтобы ввести абстрактный базовый класс PersonBase (или аналогичный) и сделать Person пустым производным классом, мой комментарий будет таким: сделайте это! Это совсем не безобразно, потому что оставляет место для изменения Person позже, не затрагивая другие производные классы. В настоящее время это будет намного сложнее. Вам придется ввести абстрактный класс позже, что является более радикальным изменением в существующем коде.

О вашей проблеме: я не могу воспроизвести это с EF 5 (VS 2012 .Net 4.5). Возможно, в вашей реальной модели происходит больше вещей.

person Gert Arnold    schedule 11.04.2013
comment
Вы правы, упрощенные тесты, которые я запускал, очевидно, были недостаточно упрощены — совершенно тривиальный пример работает так, как я надеялся. Теперь, чтобы узнать, что я делаю в другом месте, чтобы вызвать это ... спасибо за вашу помощь! - person Jeremy Todd; 11.04.2013