Домен-управляемый дизайн с ORM
Я проектирую объектную модель приложения, и между объектами и таблицами существует определенный уровень импеданса. Например у меня есть:
Product
-----------
ProductId,
ProductTypeCode,
StatusCode,
SKUNumber
ProductMarketAvailability
--------------------------
ProductMarketAvailabilityId,
ProductId,
MarketId,
Rank
ProductDescription
------------------
ProductDescriptionId,
ProductId,
MarketId,
StatusId,
DescriptionTypeId,
Description
(я не иллюстрировал таблицы поиска:Status,DescriptionType,ProductType,Market)
Я хочу иметь ДОМЕН КЛАСС:
Product
--------------
ProductId,
SkuNumber,
MarketId,
MarketName,
StatusCode,
Status,
Title ,
Description,
Caption,
Rank
С LLblGen pro или Entity Framework:
- how i can map these tables my domain class?
- Is it a best way to deal with this through Domain classes or better to
isolate domain classes from ORM generated classes
- If I manually map ORM classes data to my domain classes then when i
persisting my Domain classes (imagine they are POCO Self tracking),
how can i write managable , well crafted code ?
i dont want to write , it doesnt look so right to me:
if (myProduct.TitleisDirty)
{
ProductDescription p= myRepository.GetDescriptionById
(myProduct.ProductDescriptionIdForTitle);
p.Description=myProduct.Title;
p.SubmitChanges();
}
if (myProduct.RankisDirty)
{
ProductMarketAvailability pma= myRepository.GetMarketById
(myProduct.ProductMarketAvailabilityId);
pma.Rank=myProduct.Rank;
pma.SubmitChanges();
}
Большое спасибо за чтение.
1 ответ
Я не думаю, что вы можете сопоставить эти таблицы одному классу (по крайней мере, не в EF). Ваша модель передает отношения один-ко-многим между Product и другими таблицами. Если они имеют один и тот же первичный ключ (истинный 1:1), вы можете отобразить его в один объект.
Что касается других ваших вопросов:
- Это лучший способ справиться с этим с помощью классов домена или лучше изолировать классы домена от классов, созданных ORM?
Используйте классы из вашего выбранного инструмента ORM, не начинайте вручную создавать другую модель поверх ваших ORM-классов (если вы делаете этот код сначала, они все равно должны быть POCO)
- Если я вручную сопоставлю данные классов ORM с классами своего домена, то, когда я сохраню свои классы домена (представьте, что они являются POCO Self tracking), как я могу написать управляемый, хорошо разработанный код?
Ты не можешь
Я предполагаю, что это унаследованное приложение, и вы не можете коснуться базы данных, поэтому я предлагаю сопоставить ваши таблицы нескольким классам, а затем раскрыть функциональность, которую вы запрашиваете, как оболочки для класса Product. Пример: Product.MarketAvailability.Rank становится свойством оболочки для продукта: Product.Rank.