我有以下结构:

User has many books in his history


这被翻译成以下内容

class User { ICollection<Book> History }       // C#
User -> UserHistory (UserId, BookId) -> Book   // DB




现在,我想在历史记录中添加一个日期,以创建以下类结构:

class User { ICollection<Read> History }
class Read { Book Book, Date At }


并保持数据库架构几乎不变

User -> UserHistory (UserId, BookId, At) -> Book


我想将Read映射到UserHistory,问题是:


id的映射中应该用作Read的什么? UserHistory主键是(UserId, BookId)。我需要id才能运行NH吗?
UserHistory -> Book似乎是one-to-one的情况。
在这种情况下,如何在BookId中指定UserHistory列名?
我没有在one-to-one上看到列属性(这是我明确显示列名的原因)。

最佳答案

在您的第一种情况下,UserHistory只是一个用于多对多关系的映射表,并且没有合适的对象。现在,UserHistory表/ Read类是一个单独的实体,因此它将需要某种标识符。最简单的方法是将主键ReadId(或UserHistoryId)添加到UserHistory表中。

您不必添加单独的键,也可以在UserId和BookId上使用复合键-但是用户可以多次阅读一本书吗?假设如此,那么您还需要将At列添加到组合键以使其唯一。这变得很丑陋,并且在处理集合时会导致其他问题,所以这是不值得的。

UserHistory与Book的关系实际上是多对一的关系,而不是一对一的关系。许多不同的用户可以阅读同一本书(也许同一用户可以多次阅读一本书)。可以将多对一作为对象引用。

关于nhibernate - 针对特定场景(一对多/一对一)的正确NHibernate映射,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1594033/

10-10 15:10