Entity Framework Table для проблемы наследования иерархии - PullRequest
1 голос
/ 03 ноября 2010

У меня проблема, связанная с ТПХ, я полагаю. Это сценарий: У нас есть одна таблица с именем Artists, у которой есть некоторые свойства об исполнителях (например, имя, минибайо и т. Д.) И поле байтов, в котором биты используются для определения типа исполнителя, со значениями, такими как:

1 - Singer
2 - Actor
4 - Composer
8 - Musician
16 - Director

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

+-------------------------------------------------+
| Table: Artist                                   |
+---------------------------------------+---------+
| Name                                  | Kind    |
+---------------------------------------+---------+
| Al Pacino                             | 2       | (Actor)
+---------------------------------------+---------+
| Mel Gibson                            | 18      | (Actor and Director)
+---------------------------------------+---------+
| Dave Matthews                         | 15      | (Actor, Singer, Composer and Musician)
+---------------------------------------+---------+

Теперь я могу сделать TPH, используя обновляемые представления с хранимыми процедурами (для CRUD).
Я также знаю, что это невозможно (по крайней мере для меня!) Сделать это с помощью условного отображения, поскольку я не могу использовать выражение с побитовым ИЛИ, например, "(Kind | 2) = 2" в условии.

Я думал, альтернативно, что изменить структуру таблицы, разделив de field Kind на что-то вроде:

+-----------------------------------------------------------------------------------------+
| Table: Artist                                                                           |
+---------------------------------------+-------+--------+----------+----------+----------+
| Name                                  | Actor | Singer | Composer | Musician | Director |
+---------------------------------------+-------+--------+----------+----------+----------+
| Al Pacino                             |   1   |   0    |    0     |    0     |    0     |
+---------------------------------------+-------+--------+----------+----------+----------+
| Mel Gibson                            |   1   |   0    |    0     |    0     |    1     |
+---------------------------------------+-------+--------+----------+----------+----------+
| Dave Matthews                         |   1   |   1    |    1     |    1     |    0     |
+---------------------------------------+-------+--------+----------+----------+----------+

Может работать, но при этом, хотя я могу создать TPH, используя поля в условном отображении, EF (очевидно) выдает мне ошибку, утверждая, что производные сущности (Actor, Singer и т. Д.)

сопоставляется с теми же строками в таблице Artist.

У меня вопрос, есть ли другие способы сделать это?

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 03 ноября 2010

Ваше предложенное отображение не является ни TPH, ни реляционным. Вам также будет довольно сложно сопоставить такую ​​схему с любой хорошей ОО-моделью. Вам также может быть сложно эффективно запрашивать такую ​​БД. В схеме TPH поле дискриминатора содержит единственное скалярное значение, представляющее один тип. Это необходимо, поскольку любой экземпляр может иметь только один тип. Тип экземпляра никогда не может измениться в течение его времени жизни, и когда вы сохраняете экземпляр в БД, срок действия экземпляра фактически остается навсегда.

Итак: я думаю, было бы довольно сложно наметить такую ​​схему каким-либо способом, который EF поймет, и я не думаю, что это стоило бы усилий. Если это устаревшие данные, создайте представление либо в БД, либо в EDMX. Если это новое приложение, я думаю, вам нужно переосмыслить свою схему и придумать модель, подходящую как для ОО, так и для реляционной модели.

0 голосов
/ 23 мая 2012

Я думаю, что в этом случае вы должны уважать «композицию вместо наследования».Если человек может быть певцом и актером одновременно, наследование - явно неправильный выбор для структуры данных.

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