Домен-управляемый дизайн с ORM - PullRequest
0 голосов
/ 25 января 2012

Я проектирую объектную модель приложения, и существует определенный уровень импеданса между объектами и таблицами.Например, у меня есть:

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 Ответ

0 голосов
/ 31 января 2012

Я не думаю, что вы можете сопоставить эти таблицы одному классу (по крайней мере, не в EF). Ваша модель передает отношение один ко многим между Product и другими таблицами. Если они имеют один и тот же первичный ключ (истинный 1: 1), вы можете отобразить его в один объект.

Что касается других ваших вопросов:

  • Это лучший способ справиться с этим с помощью классов домена или лучше изолировать классы домена от классов, созданных ORM?

Используйте классы из выбранного вами инструмента ORM, не начинайте вручную создавать другую модель поверх ваших ORM-классов (если вы делаете этот код сначала, они все равно должны быть POCO)

  • Если я вручную сопоставлю данные классов ORM с классами моего домена, то когда сохранение классов моего домена (представьте, что они являются POCO Self tracking), Как я могу написать управляемый, хорошо разработанный код?

Вы не можете

Я предполагаю, что это устаревшее приложение, и вы не можете коснуться базы данных, поэтому я предлагаю сопоставить ваши таблицы нескольким классам, а затем предоставить доступ к функциональности, которую вы запрашиваете, как оболочки для класса Product. Пример: Product.MarketAvailability.Rank становится свойством оболочки для продукта: Product.Rank.

...