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

Posted

技术标签:

【中文标题】如何在 ORM (NHibernate) 中模拟这种情况?【英文标题】:How to model this situation in ORM (NHibernate)? 【发布时间】:2009-11-05 09:23:37 【问题描述】:

我一直对 Web 应用程序采用以数据为中心的方法,因此在使用 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】:

您的课程如下所示

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 时有了一个很好的开端。

【讨论】:

你知道有哪个网站可以播放这些视频吗?官方网站好像没有。 不,我没有,但您可以下载并观看它们 对于前几个屏幕投射 (6 ithink),您需要安装 Techsmith Camtasia 编解码器,之后它们对媒体播放器友好。 除非我知道应用程序需要它们,否则我不会设置双向关系(在 User 和 UserRating 之间以及在 Item 和 UserRating 之间)。只映射每个关系的一端会更简单、更有效。

以上是关于如何在 ORM (NHibernate) 中模拟这种情况?的主要内容,如果未能解决你的问题,请参考以下文章

ORM篇——有关NHibernate查询封装

从类生成数据库结构的 ORM

什么 PHP ORM 最像 NHibernate?

ABP官方文档翻译 9.3 NHibernate集成

从 Oracle 数据库构建 NHibernate ORM

Nhibernate 与其他 ORM 的区别是啥?