NHibernate 一对一关系

2024-02-29

我有以下内容Domain Model(s):

public class WriteOffApprovalUser
{
    public virtual string UserName { get; set; }
    public virtual Employee Employee { get; set; }
}

public class Employee
{
    public virtual string EmployeeID { get; set; }
    public virtual string EmployeeStatusCode { get; set; }
    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }
    public virtual string PreferredName { get; set; }
    public virtual string JobTitle { get; set; }
    public virtual string Division { get; set; }
    public virtual string Department { get; set; }
    public virtual string Location { get; set; }
    public virtual string City { get; set; }
    public virtual string DeskLocation { get; set; }
    public virtual string MailID { get; set; }
    public virtual string Phone { get; set; }
    public virtual string Fax { get; set; }
    public virtual string SecCode { get; set; }
    public virtual string UserId { get; set; }
    public virtual string SupervisorID { get; set; }
}

这些是我的Fluent Mappings

public class WriteOffApprovalUserMap : ClassMap<WriteOffApprovalUser>
{
    public WriteOffApprovalUserMap()
    {
        //Schema("LEGAL");
        Table("WRITEOFF_APPROVAL_USER");

        Id(x => x.UserName).Column("USER_NAME");

        HasOne(x => x.Employee).PropertyRef("UserId");

    }
}

public class EmployeeMap : ClassMap<Employee>
{
    public EmployeeMap()
    {
        // Table Name
        //Schema("ADP_FEED_OWNER");
        Table("ADP_EMPLOYEE");

        // Primary Key
        Id(x => x.EmployeeID).Column("EMPLID");

        // Mappings
        Map(x => x.UserId).Column("USER_ID");
        Map(x => x.FirstName).Column("FIRST_NAME");
        Map(x => x.LastName).Column("LAST_NAME");
        Map(x => x.PreferredName).Column("PREFERRED_NAME");
    }
}

这是我的查询:

var results = new Repository<WriteOffApprovalUser>(session)
                    .Query()
                    .ToList();

这是它生成的 SQL,我本来期待的是 JOIN。

select writeoffap0_.USER_NAME as USER1_1_ from WRITEOFF_APPROVAL_USER writeoffap0_
SELECT employee0_.EMPLID as EMPLID0_0_, employee0_.USER_ID as USER2_0_0_, employee0_.FIRST_NAME as FIRST3_0_0_, employee0_.LAST_NAME as LAST4_0_0_, employee0_.PREFERRED_NAME as PREFERRED5_0_0_ FROM ADP_EMPLOYEE employee0_ WHERE employee0_.EMPLID=:p0;
SELECT employee0_.EMPLID as EMPLID0_0_, employee0_.USER_ID as USER2_0_0_, employee0_.FIRST_NAME as FIRST3_0_0_, employee0_.LAST_NAME as LAST4_0_0_, employee0_.PREFERRED_NAME as PREFERRED5_0_0_ FROM ADP_EMPLOYEE employee0_ WHERE employee0_.EMPLID=:p0;
SELECT employee0_.EMPLID as EMPLID0_0_, employee0_.USER_ID as USER2_0_0_, employee0_.FIRST_NAME as FIRST3_0_0_, employee0_.LAST_NAME as LAST4_0_0_, employee0_.PREFERRED_NAME as PREFERRED5_0_0_ FROM ADP_EMPLOYEE employee0_ WHERE employee0_.EMPLID=:p0;
SELECT employee0_.EMPLID as EMPLID0_0_, employee0_.USER_ID as USER2_0_0_, employee0_.FIRST_NAME as FIRST3_0_0_, employee0_.LAST_NAME as LAST4_0_0_, employee0_.PREFERRED_NAME as PREFERRED5_0_0_ FROM ADP_EMPLOYEE employee0_ WHERE employee0_.EMPLID=:p0;

现在数据库中有四行,并且正在返回正确的数据,但我不希望有五个单独的 SQL 语句来执行此操作。


您需要急切地加载/获取 Employee 实体,以避免您看到的行为(通常称为 SELECT N+1 问题)。为此,您有两种选择:

选项1。映射中的热切加载意味着当您查询 WriteOffApprovalUser 实体时,它将always对 Employee 表执行 JOIN。注意:这可能听起来像您想要的,但要小心,因为您将迫使所有曾与该实体合作的开发人员必须遵守此设计决策,直到时间结束。您必须问自己,我是否想要查询 WriteOffApprovalUser 表并not对 Employee 表执行 JOIN。如果答案是肯定的,则不要强制在映射文件中进行预先加载。

要自动获取 Employee,请将映射中的 HasOne 代码更改为如下所示:

HasOne(x => x.Employee).PropertyRef("UserId").Not.LazyLoad().Fetch.Join();

选项 2。在查询中执行预先加载。我注意到您正在使用某种 T 模式存储库,因此您可能必须修改它才能处理急切加载。使用 NHibernate 内置 LINQ 的典型急切加载Query<T>NHibernate.Linq 命名空间中的类看起来像这样:

var results = new session.Query<WriteOffApprovalUser>()
                    .Fetch( x => x.Employee ) // This will tell NHibernate to perform a JOIN to the Employee table
                    .ToList();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NHibernate 一对一关系 的相关文章

随机推荐

  • 如何在 HighCharts 上绘制垂直线?

    我想追踪当天的垂直时间线 但我没有在 HighCharts 文档中找到解决方案 像这样 您正在寻找情节主线 请参阅此处的文档 http api highcharts com highcharts xAxis plotLines http a
  • 从 Android 中的 URL 方案打开我的应用程序

    我知道有几个关于此的问题 但没有一个可以帮助解决我的问题 我希望能够单击来自电子邮件 文本 浏览器并打开我的应用程序 我有AndroidManifest xml code
  • 连续循环页面(不是无限滚动)

    我正在寻找创建滚动功能的资源 例如在这些网站上找到的资源 前哨日记 http www outpostjournal org Unfold http unfold no 一旦滚动条到达页面底部 我希望它循环回到顶部 我对无限滚动很熟悉 但这不
  • Excel - 提取前 5 个值

    我想提取前 5 名选手基于每个员工的销售额 没有数据透视表 自动过滤器 参考我的输入和输出截图 Snapshot https i stack imgur com zYElg png 有什么建议 如何获得前 5 名排名 即使重复 如屏幕截图所
  • 相当于 XHR 或 Ajax 库中的 Fetch 'no-cors' 模式?

    有没有办法在现有的 大多数浏览器支持的 HTTP 请求中写入 fetch mode no cors 举个例子 我想知道是否可以翻译 fetch url mode no cors then function response console
  • Chrome 开发者工具工作区映射

    谁能告诉我 Chrome 开发者工具工作区映射是如何工作的 我相信目前它仅在加那利可用 我认为它应该允许我在元素视图中更改 CSS 规则 并将它们自动保存到本地文件中 正如 Paul Irish 在 Google IO 2013 上演示的那
  • 搅拌机谷歌Colab

    直到几天前 我还能够使用 GPU 在 Google Colab 上无头运行 Blender 或 sheshe it 是的 我检查了三次我选择了 GPU 实例 现在运行 keras tensorflow 确实工作正常 但 Blender 根本
  • TFS 中的错误、问题和任务之间有什么区别[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 谁能给我一个关于 TFS 中错误 问题和任务之间差异的简短解释 For the Scrum TFS 流程模板 https msdn m
  • 无法从 aws lambda 层导入模块

    我有一个 pip 包的需求文件 我将其安装在目标文件夹中并压缩内容并将其上传到 AWS lambda 层 要求 txt asgiref 3 2 3 certifi 2019 11 28 chardet 3 0 4 cloudevents 0
  • 根据 Pandas 中的多个条件过滤分组行

    给定一个数据框如下 city district date price 0 bj cy 2019 03 01 NaN 1 bj cy 2019 04 01 6 0 2 sh hp 2019 03 01 4 0 3 sh hp 2019 04
  • 带有嵌套对话框的选项卡控件中的选项卡顺序 (WS_EX_CONTROLPARENT)

    在 Win32 API C 项目中 我有一个带有选项卡控件 3 个选项卡 的对话框和作为该选项卡控件的子项的 3 个对话框 我使用 DialogBoxParam 加载带有选项卡控件的主对话框 并使用 CreateDialogParam 从资
  • UIPickerview 组件中带有标签的图像

    我的 UIPickerView 有两列 在一列中我想在其旁边显示图像和标签 有用 显示和图像和标签 只是标签在图像下面如何将图像放在左侧 标签放在右侧 我尝试将标签更改为右对齐 但它不起作用 UIView pickerView UIPick
  • 如何添加全局动作事件监听器?

    如何添加全局动作事件监听器 我试过了 Toolkit getDefaultToolkit addAWTEventListener this AWTEvent ACTION EVENT MASK 但它不起作用 示例 要侦听应用程序中的所有 M
  • FileNotFoundException 打开失败:在 Android 上将图像文件保存到内部存储期间 EPERM(不允许操作)

    当我尝试将图像保存到 Android 上的内部存储时 我遇到了这个问题 public static String setImage Bitmap image if image null FileOutputStream outputStre
  • Tkinter Optionmenu 小部件中相同值的索引

    我正在尝试访问选项菜单小部件中相同值的索引 在下面的代码中 无论我选择两个 b 字符中的哪一个 列表中的字符 b 都会返回索引 1 我需要根据列表中的索引位置区分两个 b 字符 即从选项菜单小部件中选择第一个 b 应返回索引 1 而第二个
  • 如何在Android中读取套接字输入流

    can anybody tell me how to read socket input stream Here is my code if serverIpAddress equals try InetAddress serverAddr
  • 在源代码管理中存储 SSL 证书

    只要您不存储私钥 将 Web 应用程序的 SSL 证书存储在源代码存储库中是否会存在安全问题 使用源代码管理来备份此类内容是多么容易 我有点被宠坏了 并且想充分利用它 但我也不想草率地使用它 或危及安全 不需要 证书是公开的 服务器将在每次
  • 在 golang HTTP FileServer 中设置 Content-Type 标头的 'charset' 属性

    我在测试 golang Web 应用程序时遇到问题 在部署版本中 nginx 位于应用程序前面并显式设置charset utf8 以便所有文本类型都附加字符集声明 在测试中 我直接访问 golang 应用程序 这里的内容类型没有字符集集 当
  • Intent.putExtras 不一致

    我的 AlarmManager 遇到了一个奇怪的情况 我正在使用 AlarmManager 安排一个事件 并使用intent putExtra 传入一个字符串 琴弦要么静音 要么振动 当接收器触发时 手机应该关闭铃声或将手机设置为振动 日志
  • NHibernate 一对一关系

    我有以下内容Domain Model s public class WriteOffApprovalUser public virtual string UserName get set public virtual Employee Em