如何使用 NHibernate 将新对象添加到映射为一对多的 IList?

2024-01-02

我的模型包含一个类Section其中有一个有序列表Statics这是本节的一部分。忽略所有其他属性,模型的实现如下所示:

public class Section
{
    public virtual int Id { get; private set; }
    public virtual IList<Static> Statics { get; private set; }
}

public class Static
{
    public virtual int Id { get; private set; }
}

在数据库中,关系是作为一对多实现的,其中表Static有一个外键指向Section和一个整数列Position将其索引位置存储在它所属的列表中。

映射是在 Fluent NHibernate 中完成的,如下所示:

public SectionMap()
{
    Id(x => x.Id);
    HasMany(x => x.Statics).Cascade.All().LazyLoad()
            .AsList(x => x.WithColumn("Position"));
}

public StaticMap()
{
    Id(x => x.Id);
    References(x => x.Section);
}

现在我可以加载现有的Statics,我也可以更新这些的详细信息。但是,我似乎找不到添加新内容的方法Statics to a Section,并将此更改保存到数据库中。我尝试了几种组合:

  • mySection.Statics.Add(myStatic)
  • session.Update(mySection)
  • session.Save(myStatic)

但我得到的最接近的结果(使用前两条语句)是 SQL 异常:“无法将 NULL 值插入列‘位置’”。显然是一个INSERT这里尝试了,但是NHibernate似乎没有自动将索引位置追加到SQL语句中。

我究竟做错了什么?我的映射中是否遗漏了某些内容?我需要曝光吗Position列作为属性并自己为其赋值?

EDIT:显然,如果我删除,一切都会按预期进行NOT NULL的约束Static.Position数据库中的列。我猜 NHibernate 会进行插入,并在更新行后立即使用Position value.

虽然这是问题的答案,但我不确定这是否是最好的答案。我更喜欢Position列不可为空,所以我仍然希望有某种方法可以让 NHibernate 直接在INSERT陈述。

因此,这个问题仍然悬而未决。还有其他解决方案吗?


当在 NHibernate 中使用双向一对多关系时,其中一端必须是“反向”。最佳实践是将集合的结尾设置为相反,因为这样可以避免不必要的 SQL 语句并允许 id 列“不为空”。

In 第 6.4 节 http://www.nhforge.org/doc/nh/en/index.html#collections-onetomany您可以在文档中找到以下注释:

非常重要的注意事项:如果关联的列被声明为 NOT NULL,NHibernate 在创建或更新关联时可能会导致约束冲突。为了防止出现此问题,您必须使用双向关联,并将多值端(集合或包)标记为 inverse="true"。请参阅本章后面关于双向关联的讨论。

因此,您需要将 .Inverse() 添加到 SectionMap 中的 HasMany 映射中。

public SectionMap()
{
    Id(x => x.Id);
    HasMany(x => x.Statics)
        .Cascade.All()
        .LazyLoad()
        .Inverse()
        .AsList(x => x.WithColumn("Position"));
}

您可能还需要在部分上添加和删除方法,该方法设置/重置静态的引用以及在其自己的集合中添加/删除静态:

public virtual void AddStatic(Static static)
{
    Statics.Add(static);
    static.Section = this;
}


public virtual void RemoveStatic(Static static)
{
    Statics.Remove(static);
    static.Section = null;
}

这些方法可确保关系双方的引用保持准确。

根据第 6.8 节 http://www.nhforge.org/doc/nh/en/index.html#collections-bidirectional使用索引集合时,NHibernate 不支持双向关系:

请注意,NHibernate 不支持以索引集合(列表、映射或数组)作为“多”端的双向一对多关联,您必须使用集合或包映射。

因此,如果您仍然遇到问题,请考虑使用单向关系而不是双向关系,但这可能意味着您的外键列需要可为空(根据帖子开头的注释)。否则,您可能必须将您的收藏映射为包或集合而不是列表。

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

如何使用 NHibernate 将新对象添加到映射为一对多的 IList? 的相关文章

随机推荐

  • 将函数映射到两个输入列表

    我有一个函数想要用多组输入进行测试 假设函数是 f a gt b gt c 现在我有两个输入列表 inputA a inputB b For inputA i 我要评价f input i对于列表中的每个元素inputB i 我知道我需要几个
  • React - 预填充表单

    我需要预先填充一个表单 以便用户可以编辑他们之前创建的博客 我正在寻找在 React 中执行此操作的最佳实践方法 我目前正在通过 props 将值传递给组件 然后将状态属性设置为等于 props 属性 但我读到这是一种反模式 我理解 真理之
  • 使用属性名称设置属性值[重复]

    这个问题在这里已经有答案了 可能的重复 我可以使用 Reflection 设置属性值吗 https stackoverflow com questions 7718792 can i set a property value with re
  • 在 React Native 中,redux 状态在内存中保留多长时间

    我试图了解如何在我的反应本机应用程序中管理 redux 状态 特别是 我试图弄清楚当我的应用程序最小化或设备关闭时会发生什么 有了这些知识 我就可以最好地找出如何持久化状态 并为重置 redux 状态可能出现的任何非法状态做好准备 如果重置
  • 如何检测浏览器支持requestFullscreen

    如何检测浏览器支持requestFullscreen or not 我有下面这些代码可以使 chrome safari firefox 和 opera 不完全工作 使文档全屏显示 但我想检测浏览器支持requestFullscreen或不
  • 使用 Linq 创建交叉表结果[重复]

    这个问题在这里已经有答案了 可能的重复 是否可以使用 LINQ 透视数据 https stackoverflow com questions 167304 is it possible to pivot data using linq 我想
  • UIManagedDocument OpenWithCompletionHandler 永远不会返回

    我遇到了一个奇怪的问题 我确信我对代码中其他地方的文件做了一些操作 并且它没有正确关闭或其他什么 但现在它处于报告为已关闭的状态 但当我调用 OpenWithCompletionHandler 时它永远不会返回 见下文 if the fil
  • 显示文件或对象之间的差异

    R 中有没有一种方法可以比较对象并返回有用的信息 例如差异在哪里 我需要比较文件 但愿意将它们读入 data frames 这可能可以通过命令行更好地处理 但我想将我的测试封装到一个 R 脚本中 我的下一次尝试是使用 ddply 将每一行发
  • 在第二台显示器上打开新的浏览器页面

    嗯 简单的情况 是否可以通过 Web 应用程序检测用户是否具有双显示器设置 如果可能的话 是否可以在第二台显示器上打开子浏览器页面 以便新窗口不会与旧窗口重叠 我问的原因是 我正在开发一个网络应用程序 并且家里有一个双显示器系统 当我转到该
  • 在 Kotlin 中读取所有输入行的简洁方法

    进行编码挑战时的常见模式是读取多行输入 假设您事先不知道有多少行 您想要读取直到 EOF readLine 返回 null 另外作为前言 我不想依赖 java utils 因为我是用 KotlinNative 编码的 所以没有 Scanne
  • 如何使用存储在字段值中的正则表达式执行正则表达式查找?

    给定以下模型 from django db import models from django conf import settings class UserMessage models Model user models ForeignK
  • “error_description”:“AADSTS70002:请求正文必须包含以下参数:'client_secret 或 client_assertion'

    我使用了代码https github com AzureAD azure activedirectory library for java blob master src samples public client app sample s
  • SparkContext 错误 - 文件未找到 /tmp/spark-events 不存在

    通过 API 调用运行 Python Spark 应用程序 提交申请时 响应 失败 通过 SSH 连接到 Worker 我的Python应用程序存在于 root spark work driver id wordcount py 错误可以在
  • 公制距离的正则表达式

    我想要一个RegEx匹配公制系统中的距离值 这个正则表达式应该匹配12m 100cm 1km忽略空白 尝试这个 0 1 9 d s da yzafpn mcdhkMGTPEZY m
  • 将带有分号分隔符的 CSV 导入 MongoDB 数据库

    我刚刚尝试将 CSV 文件 带有分号 分隔符 导入到 MongoDB 数据库中 我管理导入mongoimport d mydb c things type csv file files csv headerline但结果不是我所期望的 这些
  • 使用 gtsummary::tbl_regression 以科学计数法显示 p 值?

    非常感谢您的帮助 包括p values for gtsummary tbl regression函数于科学计数法 我正在使用大数据 显示 3 会非常有用p 值的小数点 gt 0 001 and p 值 一个有代表性的例子 load pack
  • 结构体与字符串文字?只读与读写? [复制]

    这个问题在这里已经有答案了 C99 标准是否允许写入复合文字 结构 它似乎不提供对文字字符串的写入 我问这个是因为它说C 编程 现代方法 第二版 http knking com books c2 index html第 406 页 问 允许
  • Vue.js 中 $set 的反义词是什么?

    在博客应用程序中 我想显示 隐藏每篇文章的评论在循环内 of posts 我知道如何通过设置来显示包含评论的divshowComments即时 this set post showComments true 但我不知道当 div 已经打开时
  • 詹金斯硒不无头运行测试

    我正在使用 jenkins 运行 pytests 硒测试 我在本地机器上进行了测试 它可以工作 但是当我运行 jenkins 时 它在远程 jenkins 机器上无头运行 在远程 jenkins 机器上创建工作区 并且失败并出现测试错误 例
  • 如何使用 NHibernate 将新对象添加到映射为一对多的 IList?

    我的模型包含一个类Section其中有一个有序列表Statics这是本节的一部分 忽略所有其他属性 模型的实现如下所示 public class Section public virtual int Id get private set p