【发布时间】:2009-11-12 11:56:22
【问题描述】:
我之前曾向a question 询问过关于用户、项目和用户评级的情况建模。在我的示例中,用户评级与一个用户和一个项目相关联。 A Nathan Fisher 提供了很好的答案,我在下面提供了他建议的模型。
但我现在有一个关于检索这些对象的问题。
模型通过保存对实体的引用来链接实体。我的问题是,如何才能最好地检索要更新的特定 UserRating? 在这种情况下我将拥有用户 ID(来自 asp.net 身份验证会话)、和 itemID(来自 URL)。此外,每个用户或项目可能有 1000 多个评分。
回到老式学校,这就像一个更新查询'其中 x = userID 和 y=itemID 一样简单。简单的。然而,在 NHibernate 中使用适当的对象模型来完成此任务的最佳方法还不是很清楚。
A) 我知道我可以创建一个存储库方法 GetRatingByUserAndItem,并将用户和项目对象同时传递给它,它会对其执行 HQL/标准查询以检索评级 但是要做到这一点,我假设我首先需要从 ORM 中检索用户和项目,然后再将它们传递回查询中的 ORM。然后我会获取 UserRating 对象,更新它,然后让 ORM 持久化更改。与旧学校的方法相比,这对我来说似乎效率低得离谱。
B) 也许我可以新建 UserRating 对象,然后创建或更新类型调用 ORM(不确定确切的语法)。这样会更好,但大概我仍然需要先检索用户和项目,这仍然非常低效。
C) 也许我应该从 ORM 中检索用户(或项目),并从其 UserRatings 集合中找到正确的 UserRating。 但是,如果我这样做了那,我如何确保我没有检索到与该用户(或项目)相关的所有 UserRatings,而只是与特定项目和特定用户相关的一个?
D) 我突然想到,我可以从模型中的 UserRating 中删除对 User 和 Item 的完整引用,而使用原始引用(UserID 和 ItemID)。 这将允许我做一些像老式方法一样简单的事情。非常诱人,但这对我来说似乎不太合适——不是非常面向对象(这肯定是我们首先使用 ORM 的主要原因!)
那么,任何人都可以提供一些明智的建议吗?我是否在正确的轨道上使用上述任何选项?或者有没有更好的方法我没有考虑过?
提前感谢您的帮助! :)
更新:
我刚刚为此发布了赏金,并且更好地理解了这一点,我还想知道,使用类似的方法,如何最好地执行以下查询:
- 检索用户未评分的所有项目。
- 检索用户评分最低的项目和项目评分。
模型如下:
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>
【问题讨论】:
标签: nhibernate hibernate orm