Домен-управляемый дизайн с 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.

Другие вопросы по тегам