如何在ORM(NHibernate)中模拟这种情况?

时间:2009-11-05 09:23:37

标签: nhibernate orm

我一直采用以数据为中心的方法来处理网络应用程序,因此使用ORM采用纯OO方法时所涉及的范式变化对我来说仍然不是完全自然的,而且现在表面上看起来很简单并不明显。

有人可以指出我如何在ORM(特别是NHibernate)中正确建模这种情况的正确方向。

情况:有很多用户,很多项目,用户可能会评价项目。

在以数据为中心/关系的方法中,它看起来像这样(并且非常简单!):

- Items Table
ItemID 
ItemName

- UserRatings Table
UserID 
ItemID 
Rating

- Users Table
UserID 
UserName

如果您想了解您的登录用户为特定商品提供的评分,您只需进行加入查询。

但是,在使用ORM时,如何以OO方式对其进行建模并不明显。我相信我需要三个域类:Item,UserRating和User。据推测,我还需要Items类中的UserRatings集合,以及User类中的UserRatings集合。但是如何从我加载的特定项目导航到核心UserRating(当然这个UserRating必须是与我感兴趣的用户相关的一个)。

有人可以为我澄清这个吗?

由于

1 个答案:

答案 0 :(得分: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屏幕演员以及Stephen Bohlen的Autumn of Agile系列节目,这给了我一个很好的nhibernate开头。