我有以下结构:
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
,问题是:
- 在
Read
的映射中,我应该使用什么作为id
?UserHistory
主键是(UserId, BookId)
。 NH 是否需要id
才能工作? UserHistory -> Book
似乎是一对一
的情况。 在这种情况下,如何在UserHistory
中指定BookId
列名? 我没有在one-to-one
上看到列属性(我有理由明确列名)。
最佳答案
在您的第一个场景中,UserHistory 只是一个多对多关系的映射表,没有合适的对象。现在,UserHistory 表/Read 类是一个单独的实体,因此它需要某种标识符。最简单的方法是在 UserHistory 表中添加一个主键 ReadId(或 UserHistoryId)。
您不必添加单独的键,可以在 UserId 和 BookId 上使用复合键——但是用户可以多次阅读一本书吗?假设是这样,那么您还需要将 At 列添加到复合键以使其唯一。这变得很丑陋,并且会在处理集合时导致其他问题,因此不值得这样做。
UserHistory 与 Book 的关系实际上是多对一的,而不是一对一的。许多不同的用户可以阅读同一本书(也许同一用户可以多次阅读一本书)。将多对一视为对象引用。
关于nhibernate - 针对特定场景(一对多/一对一)更正 NHibernate 映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1594033/