2009-11-05 2 views
1

Я всегда принимал ориентированный на данные подход к веб-приложениям, и поэтому изменение парадигмы, связанное с использованием чистого подхода OO с использованием ORM, до сих пор не совсем естественным для меня, и evey сейчас и тогда нечто очевидное простое не очевидно.Как смоделировать эту ситуацию в ORM (NHibernate)?

Может кто-то, пожалуйста, укажите мне правильное направление правильной модели этой ситуации в ORM (в частности, NHibernate).

Ситуация: Есть много Пользователей, Много Элементов, пользователи могут оценивать Предметы.

В ориентированных данных/реляционного подхода будет выглядеть следующим образом (и быть очень легко!):

- Items Table 
ItemID 
ItemName 

- UserRatings Table 
UserID 
ItemID 
Rating 

- Users Table 
UserID 
UserName 

Если вы хотите узнать, что рейтинг вашего зарегистрированного пользователя дал для конкретного пункта, вы просто выполните объединенный запрос.

Однако для меня не очевидно, как моделировать это способом OO при использовании ORM. Я верю Мне нужны три класса домена: Item, UserRating и User. Предположительно, мне также нужна коллекция UserRatings в классе Items и коллекция UserRatings в классе User. Но как я могу перейти к запросу UserRating, от определенного элемента, который я загрузил (и, конечно, это UserRating должно быть тем, что связано с пользователем, которого я интересую).

Может ли это прояснить это для меня?

Благодаря

ответ

2

Ваши классы будут выглядеть следующим образом

public class User 
{ 
    public virtual int UserId { get; set; } 
    public virtual string UserName { get; set; } 
    public virtual IList<UserRating> Ratings { get; set; } 
} 

public class Item 
{ 
    public virtual int ItemId { get; set; } 
    public virtual string ItemName { get; set; } 
    public virtual IList<UserRating> Ratings { get; set; } 
} 
public class UserRating 
{ 
    public virtual User User { get; set; } 
    public virtual Item Item { get; set; } 
    public virtual Int32 Rating { get; set; } 
} 

Ваш файл отображения будет выглядеть

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Test" namespace="Test" > 
    <class name="User"> 
     <id name="UserId" > 
      <generator class="native" /> 
     </id> 
     <property name="UserName" /> 
     <bag name="Ratings" generic="true" inverse="true" table="UserRating"> 
      <key column="UserId" /> 
      <one-to-many class="UserRating"/> 
     </bag> 
    </class> 
    <class name="Item" > 
     <id name="ItemId" > 
      <generator class="native" /> 
     </id> 
     <property name="ItemName" /> 
     <bag name="Ratings" generic="true" inverse="true" table="UserRating"> 
      <key column="ItemId" /> 
      <one-to-many class="UserRating"/> 
     </bag> 
    </class> 
    <class name="UserRating" > 
     <composite-id> 
      <key-many-to-one class="User" column="UserId" name="User" /> 
      <key-many-to-one class="Item" column="ItemId" name="Item" /> 
     </composite-id> 
     <property name="Rating" /> 
    </class> 
</hibernate-mapping> 

Я хотел бы предложить вам посмотреть на Summer of Nhibernate экран закиньте, а также Autumn of Agile серии Стивена Болена, который дал мне отличное начало с nhibernate.

+0

Знаете ли вы, что сайт taht передает эти видео? Сайт оффлайн не кажется. – UpTheCreek

+0

Нет, я не могу, но вы можете просто скачать их и посмотреть их. –

+0

Для первых нескольких скриншотов (6 ithink) вам нужно будет установить Techsmith Camtasia Codecs, после чего они будут дружелюбны к медиа-плеерам. –

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