2010-11-03 2 views
1

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

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).
Я также знаю, что это невозможно (для меня, по крайней мере!) Сделать это с помощью условного сопоставления, так как я не могу использовать выражение с побитовым ИЛИ, например, «(Вид | 2) = 2» в состоянии.

Я думал, altenativelly, что изменение структуры таблицы путем расщепления де поля 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.

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

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

ответ

1

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

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

0

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

Смежные вопросы