nhibernate - 针对特定场景(一对多/一对一)更正 NHibernate 映射

标签 nhibernate one-to-many one-to-one many-to-one

我有以下结构:

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,问题是:

  1. Read 的映射中,我应该使用什么作为 idUserHistory 主键是(UserId, BookId)。 NH 是否需要 id 才能工作?
  2. 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/

相关文章:

php - 从 Laravel 中具有一对多关系的 4 个表中检索值

mysql - SQL 查询中的复杂条件

使用 System.Runtime.Caching 的 Nhibernate 缓存提供程序

nhibernate - 如何使用 Criteria 或 QueryOver API 编写此 linq 查询

NHibernate 连续记录并执行查询两次

python - OneToOne 关系和 django-autocomplete-light

sql - Sql Server 和 LINQ 中的一对一关系

c# - NHibernate IPreUpdateEventListener,IPreInsertEventListener 不保存到数据库

ios - 核心数据一对多关系在创建新关系时被删除

mysql - SQL 一对多返回 & 按搜索条件分组