Использование Entity Framework для отображения на подклассы объектов POCO на основе ячейки в строке базы данных - PullRequest
2 голосов
/ 20 января 2011

Я использую Entity Framework и C # POCO объекты. У меня есть некоторые объекты, которые отличаются только поведением; строки данных, к которым они относятся в БД, идентичны. В базе данных есть строка, определяющая класс, содержащий поведение.

Мне бы очень хотелось использовать абстрактный класс для реализации общего поведения, а затем создать экземпляр класса из Entity Framework на основе этой строки в базе данных. Этот пример не тот, над которым я работаю, но я думаю, что он аналогичен. Если это неправильный способ обработки документа, это потому, что это всего лишь аналогия, и я ничего не знаю об управлении документами:)

Например, учитывая эти две строки из таблицы «Документ» (со строкой заголовка):

DocumentId  Description         DocumentType
314     A word processing document  WordProcessingDocument
315     A spreadsheet           SpreadsheetDocument

В идеале я должен был бы получить один Document.WordProcessingDocument и один Document.SpreadsheetDocument, который будет иметь общее поведение, описанное в абстрактном классе Document. Entity Framework по-прежнему будет управлять этими объектами и их отношениями с другими объектами.

Можно ли это сделать? Или Entity Framework может создавать только один класс на таблицу? Не имеет смысла создавать новую таблицу для каждого подтипа, поскольку в этих таблицах не будет данных. Эти подклассы отличаются только поведением, а не данными.

Ответы [ 2 ]

3 голосов
/ 20 января 2011

Это называется Таблица на Hiearchy (или TPH), и это возможно в EF.Вы должны смоделировать ваш базовый класс как сущность, а ваши конкретные классы как сущности, производные от базового класса.Вам нужен один специальный столбец (возможно, DocumentType в вашем примере) с именем Discriminator, который не отображается как данные, но определяет, какой подкласс должен быть материализован при загрузке строки из БД.

3 голосов
/ 20 января 2011

Да, это стандартный шаблон наследования таблиц, в котором используется столбец дискриминатора, а не отношение 1: 1. Создайте два новых типа в своем EDMX, которые наследуются от текущего типа таблицы, затем используйте редактор отображений, чтобы указать столбец (DocumentType), который определяет, какой подкласс создавать и значение, соответствующее каждому подклассу. Нет необходимости добавлять в них какие-либо дополнительные столбцы, но вы можете использовать частичные классы для определения собственной бизнес-логики или поведения для каждого отдельного типа.

Это также означает, что EF автоматически позаботится о присвоении этих значений строкам при вставке. Другими словами, вы создадите экземпляр SpreadsheetDocument или WordProcessingDocument и просто позвоните AddObject. При выборе этого маршрута столбец DocumentType будет полностью скрыт из вашего кода.

...