Entity Framework и наследование
От: Idsa Россия  
Дата: 25.07.08 06:23
Оценка:
В БД есть сущность каталог. В зависимости от значения ParentId каталог может быть корневым или дочерним (если ParentId is null — корневой, иначе — дочерний). Для добавления каталогов в СУБД написано 2 хранимые процедуры: одна для корневых каталогов, другая для дочерних. Конечно, можно было написать логику добавления общую и для корневых, и для дочерних каталогов... но так действительно проще: система такова, что при создании корневых каталогов некоторые параметры не нужны.
Я вот думаю, как бы красиво замапить эти хранимки в Entity Framework: сущность-то одна, а хранимки две. Есть идея заюзать наследование: от абстрактной сущности BaseCatalog (хранящей все атрибуты) наследовать RootCatalog и Catalog (и каждой из этих сущностей назначить соответствующую хранимую процедуру на вставку). А затем в DAL'е сделать функцию AddCatalog, которая в зависимости от значения ParentId будет создавать либо RootCatalog, либо Catalog.
Меня смущеает то, что сущности RootCatalog и Catalog будут пустыми... и какое же это тогда наследование?!
Подскажите, может, есть более красивые решения.
... << RSDN@Home 1.2.0 alpha 4 rev. 1096>>
Re: Entity Framework и наследование
От: stump http://stump-workshop.blogspot.com/
Дата: 25.07.08 06:51
Оценка: +1
Здравствуйте, Idsa, Вы писали:

I>В БД есть сущность каталог. В зависимости от значения ParentId каталог может быть корневым или дочерним (если ParentId is null — корневой, иначе — дочерний). Для добавления каталогов в СУБД написано 2 хранимые процедуры: одна для корневых каталогов, другая для дочерних. Конечно, можно было написать логику добавления общую и для корневых, и для дочерних каталогов... но так действительно проще: система такова, что при создании корневых каталогов некоторые параметры не нужны.

I>Я вот думаю, как бы красиво замапить эти хранимки в Entity Framework: сущность-то одна, а хранимки две. Есть идея заюзать наследование: от абстрактной сущности BaseCatalog (хранящей все атрибуты) наследовать RootCatalog и Catalog (и каждой из этих сущностей назначить соответствующую хранимую процедуру на вставку). А затем в DAL'е сделать функцию AddCatalog, которая в зависимости от значения ParentId будет создавать либо RootCatalog, либо Catalog.
I>Меня смущеает то, что сущности RootCatalog и Catalog будут пустыми... и какое же это тогда наследование?!
I>Подскажите, может, есть более красивые решения.
Действительно, не красиво и не оправдано (изврат, иными словами).
Да к тому же, у тебя ничего не получится. Чтобы замапить иерархию наследников на одну таблицу, нужно иметь в таблице поле дескриминатор, по которому EF будет определять к какому типу относится конкретная сущность. ParentId дескриминатором быть не может.
Лучше поправь свои хранимки, это дешево и эффективно.
Понедельник начинается в субботу
Re[2]: Entity Framework и наследование
От: Idsa Россия  
Дата: 25.07.08 06:59
Оценка:
Здравствуйте, stump, Вы писали:

S>Да к тому же, у тебя ничего не получится. Чтобы замапить иерархию наследников на одну таблицу, нужно иметь в таблице поле дескриминатор, по которому EF будет определять к какому типу относится конкретная сущность. ParentId дескриминатором быть не может.

Хм... А почему это поле ParentId не может быть дескриминатором? Я планировал задать в RootCatalog условие ParentId is null, а в каталог — ParentId is not null. Разве не сработает?
... << RSDN@Home 1.2.0 alpha 4 rev. 1096>>
Re[3]: Entity Framework и наследование
От: stump http://stump-workshop.blogspot.com/
Дата: 25.07.08 07:16
Оценка:
Здравствуйте, Idsa, Вы писали:

I>Здравствуйте, stump, Вы писали:


S>>Да к тому же, у тебя ничего не получится. Чтобы замапить иерархию наследников на одну таблицу, нужно иметь в таблице поле дескриминатор, по которому EF будет определять к какому типу относится конкретная сущность. ParentId дескриминатором быть не может.

I>Хм... А почему это поле ParentId не может быть дескриминатором? Я планировал задать в RootCatalog условие ParentId is null, а в каталог — ParentId is not null. Разве не сработает?

Попробуй, чего гадаешь. ParentId тебе придется использовать в navigation properties. Будет конфликт и прикомпиляции схемы EF будет ругаться (в beta 3, во всяком случае, так было).
Понедельник начинается в субботу
Re[4]: Entity Framework и наследование
От: Idsa Россия  
Дата: 25.07.08 09:02
Оценка:
Здравствуйте, stump, Вы писали:

S>Попробуй, чего гадаешь. ParentId тебе придется использовать в navigation properties. Будет конфликт и прикомпиляции схемы EF будет ругаться (в beta 3, во всяком случае, так было).

Честно говоря, я не понял, зачем "ParentId использовать в navigation properties.

Я удалил из BaseCatalog атрибут ParentId, добавил 2 сущности (RootCatalog и Catalog), соединив каждую из них связью наследования с BaseCatalog:

После этого появилась ошибка "Entity types RootCatalog, Catalog are mapped to table LibraryCatalogs without discriminating conditions on all mappings to the table. Оказывается, это баг дизайнера: http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=3324129&amp;SiteID=1, и эту ошибку можно проигнорировать.
Таким образом, у меня получилось реализоваь задуманное... правда, пожалуй, использовать на практике я этого не буду
... << RSDN@Home 1.2.0 alpha 4 rev. 1096>>
Re[5]: Entity Framework и наследование
От: stump http://stump-workshop.blogspot.com/
Дата: 25.07.08 10:41
Оценка:
Здравствуйте, Idsa, Вы писали:

I>Здравствуйте, stump, Вы писали:


S>>Попробуй, чего гадаешь. ParentId тебе придется использовать в navigation properties. Будет конфликт и прикомпиляции схемы EF будет ругаться (в beta 3, во всяком случае, так было).

I>Честно говоря, я не понял, зачем "ParentId использовать в navigation properties.
У тебя же дерево.
Понедельник начинается в субботу
Re[6]: Entity Framework и наследование
От: Idsa Россия  
Дата: 25.07.08 12:17
Оценка:
Здравствуйте, stump, Вы писали:

I>>Честно говоря, я не понял, зачем "ParentId использовать в navigation properties.

S>У тебя же дерево.
Вы имеете в виду то, что в ParentId должен быть foreign key на Id?
... << RSDN@Home 1.2.0 alpha 4 rev. 1096>>
Re[7]: Entity Framework и наследование
От: stump http://stump-workshop.blogspot.com/
Дата: 25.07.08 17:40
Оценка:
Здравствуйте, Idsa, Вы писали:

I>Здравствуйте, stump, Вы писали:


I>>>Честно говоря, я не понял, зачем "ParentId использовать в navigation properties.

S>>У тебя же дерево.
I>Вы имеете в виду то, что в ParentId должен быть foreign key на Id?
Да, что-то типа того.
Понедельник начинается в субботу
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.