2012-03-15 38 views
0

好吧我在一个情况我有以下各表NHibernate的设计和组合键

用户(用户ID ....) UserFavourite(用户ID,OtherUserId,ADDDATE)

如果你的“最爱“另一个用户向userFavourite添加一行。现在,我在UserId和OtherUserId列和具有两个外键约束的User表之间具有参照完整性。

我的问题是,通过NHibernate访问它的最佳做法是什么?基本的Get <>方法需要一个id,它是ID列。在这种情况下,表的唯一标识特性是UserId和OtherUserId的组合键,所以这导致我认为我应该有一个组合键。我到处看到他们不好,如果数据库设计正确,我不应该使用它们。

所以我想我还能怎么设计数据库,我想我可以有

UserFavourite(的UniqueID,用户ID,OtherUserId,ADDDATE)

并作出唯一ID的PK和ID的获取方法,并在UserId/OtherUserId列上放置一个唯一约束。然而,这并不能解决我的问题,因为当我想通过代码删除该行或获取它时,我仍然需要传递我无法访问的UniqueID。我希望能够说

“从您的收藏夹中删除此用户(用户ID 142)”。所以我只能访问UserId和你自己的UserId,所以我需要使用这两个ID来运行NHibernate查询,而不是唯一的ID。

有人可以指示我如何通过理想的做法在NHibernate中处理这种情况的方向,以便我可以轻松高效地执行这些查询而不使用组合键吗?

回答

0

对于纯关系表,你可能已经对许多一对多映射(见NHibernate Many-to-many

考虑你们的关系表保存数据作为ADDDATE(或许更晚),我觉得你应该去对于UniqueID,然后有集合映射

  • 两个one-to-many与从User类到UserFavourite类的inverse =“true”。
  • 两个many到一个从UserFavourite类用户类

你可能永远不会使用的唯一ID删除UserFavourite。您只需在当前用户的UserFavourites中筛选所需的UserFavourite,然后将其删除。

也许你不会经常使用AddDate。我想用正确的映射属性相对于更新(级联,保存,更新,删除),你可以结合这两种方法(多对多+关系映射)。

+0

我对用户类上的两个一对多映射有点困惑,你可以发布一个示例映射吗?我不知道你们是如何声明UserId属性,并在该文件中有相同的属性两个单独的映射。另外当你说我可能永远不会使用UniqueId进行删除时,我该如何删除?我认为使用会话对象删除的唯一方法是使用ID? – NZJames 2012-03-16 09:57:59