如何使用 NHibernate 将实体分布在多个表上?

2024-06-18

我有预先存在的表,使用一种开放模式。我有一个项目表,各种实体被分类为项目,然后将属性存储在项目属性表中。单个实体类型可能具有存储在多个表中的字段。我们公开带有视图的实体。所以,大多数实体对应一个视图,然后当我们插入/更新时,我们必须系统地更新表或使用存储过程。

我正在尝试确定 NHibernate 是否会比我们的定制存储库(遵循工厂模式)为我们带来任何好处。现在,我发现让 NHibernate 处理这种数据库模式非常困难。在我看来,我们要么必须完全重构我们的数据库以遵循 NHibernate 的约定,要么以某种方式完全重构或实体。

除了涉及或多或少遵循 NHibernate 约定的数据库的最简单的示例之外,我在文档中没有看到太多有关如何执行此操作的信息。

这是一个代表性的数据库图。我们将 Episode 作为一个实体,它从 Item、IP_Episode、IP_EpisodeBroadcastInfo、IP_Show 等中提取信息来构建它需要的所有字段。


你提到了约定。这是 Fluent NHibernate 的概念,是的,您所做的并不完全符合 Fluent NHibernate 的现有约定。然而,这完全在 NHibernate 的能力范围之内。 NHibernate 擅长映射到各种不同的数据库模式。不要觉得受到 Fluent NHibernate 希望您采用的方式的限制。我并不是说不要使用 Fluent NHibernate。如果您的数据库架构一致且合理,您可以编写自己的约定来匹配。

为了说明 NHibernate 的灵活性,我们假设我们有一个与此类似的表结构:

create table Episode (
    Id int not null primary key,
    NumberInSeries int null
);

create table Show (
    Episode_id int not null primary key,
    Title nvarchar(100) not null,
    foreign key (Episode_id) references Episode (Id)
);

create table Broadcast (
    Episode_id int not null primary key,
    InitialAirDate datetime not null,
    foreign key (Episode_id) references Episode (Id)
);

一排进入Episode对应于零行或一行Show和零行或一行Broadcast。您可以在 .NET 中通过多种不同的方式对这种类型的关系进行建模。以下是 NHibernate 提供的各种选项:

1. 继承

public class Episode
{
    public virtual int Id { get; set; }
    public virtual int? NumberInSeries { get; set; }
}

public class Show : Episode
{
    public virtual string Title { get; set; }
}

public class Broadcast : Episode
{
    public virtual DateTime InitialAirDate { get; set; }
}

当您想要建模不会改变的关系时,请使用此选项。如果一集是一场演出,那么它始终是一场演出。此外,这种建模意味着剧集不能同时是节目和广播。我不认为这是您想要的,但您可能会发现它在模型的其他地方很有用。

欲了解更多信息,请参阅...

  • 关于继承映射的官方文档 http://nhforge.org/doc/nh/en/index.html#inheritance
  • Ayende 关于继承映射的博客文章 http://ayende.com/blog/3941/nhibernate-mapping-inheritance

2. one-to-one

public class Episode
{
    public virtual int Id { get; set; }
    public virtual int? NumberInSeries { get; set; }
    public virtual Show Show { get; set; }
    public virtual Broadcast Broadcast { get; set; }
}

public class Show
{
    public virtual Episode Episode { get; set; }
    public virtual string Title { get; set; }
}

public class Broadcast
{
    public virtual Episode Episode { get; set; }
    public virtual DateTime InitialAirDate { get; set; }
}

这使您可以更好地控制哪些表实际包含与给定剧集关联的行,因为您可以设置episode.Broadcast = null例如。拥有给定剧集的演出和广播信息也很好。

欲了解更多信息,请参阅...

  • 官方文档one-to-one http://nhforge.org/doc/nh/en/index.html#mapping-declaration-onetoone
  • Ayende 的博客文章one-to-one http://ayende.com/blog/3960/nhibernate-mapping-one-to-one

3. join

public class Episode
{
    // These properties come from the Episode table...
    public virtual int Id { get; set; }
    public virtual int? NumberInSeries { get; set; }

    // This one comes from the Show table.
    public virtual string Title { get; set; }

    // This one comes from the Broadcast table.
    public virtual DateTime InitialAirDate { get; set; }
}

这是一种很好且简单的表示数据的方法,但是您无法控制是否将行插入到 Show 和 Broadcast 表中。

欲了解更多信息,请参阅...

  • 官方文档join http://nhforge.org/doc/nh/en/index.html#mapping-declaration-join
  • Ayende 的博客文章join http://ayende.com/blog/3961/nhibernate-mapping-join

既然您说“单个实体类型可能具有存储在多个表中的字段”,那么在我看来,join应该能够处理您当前建模的方式。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 NHibernate 将实体分布在多个表上? 的相关文章

随机推荐

  • 帮我用 PHP 解析这个文件

    Fri Nov 27 10 00 01 EST 2009 974 12506 Fri Nov 27 11 00 01 EST 2009 988 12655 Fri Nov 27 12 00 01 EST 2009 1005 12886 Fr
  • 使用Python选择屏幕区域

    我正在用 Python 开发一个屏幕截图实用程序 目前它是专门针对 Linux 的 到目前为止 我已经能够拍摄完整桌面的屏幕截图 并将其上传到 Imgur 然后将链接复制到剪贴板 现在我想扩展到诸如活动窗口或特定选择的屏幕截图之类的功能 如
  • 我如何知道 k8s 中的网络策略覆盖了哪些 pod

    我有一个用例 我想检查网络策略覆盖哪些 pod 现在我的重点只是 k8s 生成的网络策略 做到这一点最简单的方法是什么 我知道我们可以检查每个网络策略并从那里过滤掉 pod 但是网络策略可以有多种使用 pod 过滤的方式 我不确定是否有办法
  • 在复选框内映射复选框 ReactJS

    我有一个函数 一旦主复选框被选中 就会触发子复选框 并且所有这些复选框都是从 JSON 映射的 主复选框 最高级别 及其下面的所有子复选框 第二级别 都会在单击时显示 并且效果很好 我想要显示的是单击时主复选框 第三级别 的子复选框2 级项
  • 自定义 Vim HTML 语法

    我有一个脚本可以读取 HTML 文件并替换出现的 foo 具有 Perl 设置的值 像这样的东西 span class hi mom span 会在浏览器中产生类似这样的内容 span class classyclass Hello Wor
  • 使用 swift,是否可以访问辅助功能中的反转颜色功能?

    苹果已经在手机中添加了一般 gt 辅助功能 gt 反转颜色的功能 我可以以某种方式在我的程序中使用它 例如当用户触摸屏幕时颜色反转吗 我不知道有什么方法可以自动执行此操作 但您可以使用 UIColor 上的扩展并访问子视图自行反转颜色 ex
  • 如何让 mod_perl 在更改时重新加载源文件?

    我正在开发一个带有 mod 的应用程序 perl 并在每次更改代码时重新启动服务器是一个巨大的阻力 我还是想用mod perl 用于开发 因为我计划将其用于实时服务器 我在文档中没有看到有关如何执行此操作的任何内容 想法 我认为 Apach
  • 使用 TLS 证书 JDBC 连接到 Oracle 数据库

    我正在尝试用 Java 编写一个连接类来使用 JDBC 驱动程序连接到 Oracle 数据库 但我想保护用于连接到 Oracle 数据库的参数 例如 jdbcurl 用户名 密码 我必须使用 TLS 证书概念来连接到 Java 中的 Ora
  • 使用实例配置文件凭证的 AWS CLI

    在我的 EC2 实例中使用 AWS CLI 时 如何指定要使用实例配置文件凭证 文档说 Instance profile credentials these credentials can be used on EC2 instances
  • 带有 -noserver 的 GWT

    我正在制作一个使用 PHP 连接到 DB2 数据库的 GWT 项目 当我编译项目并将其部署到服务器 复制 WAR 目录的内容 时 它工作正常 显然在托管模式下我遇到了 SOP 问题 因为 GWT 在端口 8888 上 而 php 脚本在端口
  • 有没有多核利用NoSQL系统?

    我从昨天开始就开始使用 MongoDB 并且非常喜欢它 我正在尝试导入大量数据 20 亿行 并为其建立索引 但它似乎没有使用我的系统拥有的 8 个核心 并且导入以正常速率 60000 条记录 秒 进行 我只能想象索引这个集合中的两列可能需要
  • 从调试版本检测发布版本的最佳方法? 。网

    所以我有大约 10 个简短的 css 文件与 mvc 应用程序一起使用 有像 错误 css 登录 css ETC 只是一些非常短的 css 文件 使更新和编辑变得容易 至少对我来说 我想要的是能够优化 if else 分支而不是将其合并到最
  • android - 定期轮询服务器并将响应显示为通知[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在构建一个Android应用程序 我需要每三个小时从服务器获取一些通知数据 文本 并使用NotificationManager将其
  • 从 Jekyll 插件向页面添加属性

    假设我想要一个包含如下内容的页面 h1 page comment count Comment s h1 for c in page comment list div strong c title strong br c content di
  • ExpirationError(代码= StatusCode.DEADLINE_EXCEEDED,详细信息=“超过截止日期”)

    我正在关注tutorial https www youtube com watch v T afaArR0E8用于使用tensorflow services部署inception模型 我使用的是ubuntu 16 04和bazel 13 0
  • css 表格单元格,内容有不必要的上边距

    我在代码中使用 div 块的表格单元格排列 我的代码有问题 我的 html 的预览是here http jsbin com avozik 10 edit preview 当我的第一个面板中有任何内容 文本或图像 时 inner第二个和第三个
  • Scalatest PlusPlay Selenium 无法调整窗口大小

    对此已经研究了一段时间 我似乎找不到使用 scalatest plus 调整窗口大小的方法 我发现在线搜索或文档的唯一方法http doc scalatest org 2 1 5 index html org scalatest selen
  • 数字和数字对象有什么区别?

    存储在普通变量中的数字有什么区别 var foo 5 和一个数字对象 var bar new Number 5 数字对象可以用来做什么 A Number对象包含一些有用的方法和属性 例如 数字对象方法 Method Description
  • DOM 元素宽度可以是非整数吗?

    我有一个页面 其 div 元素由 JavaScript 对齐 JavaScript 只是检查一组 div 元素来查找最大值偏移宽度 然后设置所有 div 元素 width成为最大偏移宽度 它在大多数浏览器和区域设置中都能完美运行 但在 Ma
  • 如何使用 NHibernate 将实体分布在多个表上?

    我有预先存在的表 使用一种开放模式 我有一个项目表 各种实体被分类为项目 然后将属性存储在项目属性表中 单个实体类型可能具有存储在多个表中的字段 我们公开带有视图的实体 所以 大多数实体对应一个视图 然后当我们插入 更新时 我们必须系统地更