Nhibernate设计和复合密钥

本文关键字:复合 密钥 Nhibernate | 更新日期: 2023-09-27 18:28:00

好的,我有以下表格

用户(UserId….)用户收藏夹(UserId,OtherUserId,AddDate)

如果你"喜欢"另一个用户,它会在用户收藏夹中添加一行。现在,我在UserId和OtherUserId列以及具有两个外键约束的User表之间都具有引用完整性。

我的问题是,通过NHibernate访问此内容的最佳实践是什么?基本的Get<>方法获取一个id,即id列。在这种情况下,表的唯一标识特征是UserId和OtherUserId的复合键,所以这让我认为我应该有一个复合键。我到处都读到它们很糟糕,如果数据库设计正确,我就不应该使用它们。

所以我想到了如何设计DB,我想我可以有

用户收藏夹(唯一ID、用户ID、其他用户ID、添加日期)

并将UniqueId设为Get方法的PK和ID,并对UserId/OtherUserId列设置唯一约束。然而,这并不能解决我的问题,因为当我想通过代码删除行或获取行时,我仍然需要传递UniqueID,我将无法访问该ID

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

有人能告诉我在NHibernate中应该如何通过理想的实践来处理这种情况吗?这样我就可以在不使用复合键的情况下轻松高效地进行这些查询了?

Nhibernate设计和复合密钥

对于纯关系表,您可以使用多对多映射(请参见NHibernate多对多)

考虑到您的关系表将数据保存为AddDate(可能稍后会更新),我认为您应该使用UniqueID,然后使用集合映射

  • 从User类到UserFavorite类的两个一对多,inverse="true"
  • 从UserFavorite类到用户类的二比一

您可能永远不会使用UniqueId来删除UserFavorite。您只需在当前用户的用户收藏夹中筛选所需的用户收藏夹,然后将其删除。

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