Доступ к свойству, используемому в сопоставлении сущности, к таблице в EFv4 - PullRequest
2 голосов
/ 13 февраля 2011

Когда у нас есть две сущности в диаграмме EFv4 EDM и только одна таблица для обеих в базе данных (например, с таблицей Documents и сущностями Invoice и Qoute таблицы), таблица Documents имеет столбец documentTypeId в качестве дискриминатора и устанавливает этот столбец в качестве дискриминатора в EDM (в таблицах), как мы читаем значение этого свойства в нашем коде?

Мы не можем присвоить ему значения, потому что EF делает это для нас под капотом (основываясь на том, что мы ввели в отображение таблиц для условия), но почему-то я не понимаю, почему нам также не разрешено читать его.

Ответы [ 2 ]

2 голосов
/ 14 февраля 2011

Imo это свойство уже сопоставлено, поэтому вы не можете отобразить его снова.Он используется для определения типа материализованного объекта.Зачем вам такой столбец.Обычно достаточно использовать оператор is, например:

  var document = context.Documents.GetById(id);
  if (document is Invoice)
  {
    ...
  }

Если вам нужно только выбрать подтипы, вы можете использовать метод расширения OfType, например:

  var invoices = context.Documents.OfType<Invoice>().ToList();

Вы также не можетенужно установить это значение при добавлении новой сущности, потому что вы добавляете подтип - Счет или Цитата.

Редактировать:

Как я понял из вашего комментария, вам не нужноэта информация в запросе.В таком случае вам не нужно отображать это.Просто используйте частичный класс вашей сущности и добавьте пользовательское свойство, которое будет возвращать вашу строку.Звучит как глупое решение, но на самом деле оно будет самым простым.

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

0 голосов
/ 13 февраля 2011

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

Таким образом, вы можете иметь абстрактный класс Document, включающий столбец DocumentTypeId. Invoice s и Quote s расширяют этот класс, но указывают определенные DocumentTypeId фильтры. Однако, поскольку исходный класс имеет столбец DocumentTypeId, у каждого из них также будет этот столбец.

Еще одним преимуществом этого подхода является то, что вы можете создавать служебные методы, которые могут работать с любым Document, и вы можете передавать любые Invoice или Quote этим методам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...