为什么 NHibernate 在选择时删除然后插入复合元素?

2024-04-30

有人可以向我解释一下关于 NHibernate 如何处理复合元素的这个小谜团吗?

我的课程看起来像这样;

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

    public virtual ISet<Comment> Comments
    {
        get;
        set;
    }
}

public class Comment
{
    public virtual string CommentText
    {
        get;
        set;
    }

    public virtual DateTime Date
    {
        get;
        set;
    }
}

和这样的映射;

<class name="Blog" table="blog">
    <id name="Id" column="id" unsaved-value="0">
      <generator class="hilo"/>
    </id>

    <set name="Comments" table="blog_comments">
      <key column="blog_id" />
      <composite-element class="Comment">
        <property name="CommentText" column="comment" not-null="true" />
        <property name="Date" column="date" not-null="true" />
      </composite-element>
    </set>

  </class>

但是,当我执行这样的选择时;


using (ITransaction transaction = session.BeginTransaction())
{
    Blog blog = session.CreateCriteria(typeof(Blog))
                  .SetFetchMode("Comments", FetchMode.Eager)
                  .Add(Expression.IdEq(2345))            
                  .UniqueResult();

    transaction.Commit();
}

NHibernate 发出一个带有连接的选择来获取包含帖子的博客,但然后删除所有评论,然后插入评论!它为什么要这样做?如果我不使用事务,那么它将只执行选择,而不是像我期望的那样执行删除和插入。我缺少什么?我正在使用 NHibernate 2.0


我认为你需要重写 Comment 上的 Equals() 和 GetHashCode() 。 NHibernate 没有用于实体相等的 ID,因此您必须定义什么使评论实体等于另一个评论。

可能是错的:)


Edit

From nhibernate.info https://nhibernate.info/doc/nhibernate-reference/components.html#components-incollections (8.2)

注意:如果定义一组复合元素,正确实现 Equals() 和 GetHashCode() 非常重要。

以及实现 Equals / GetHashCode 的示例nhibernate.info https://nhibernate.info/doc/nhibernate-reference/persistent-classes.html#persistent-classes-equalshashcode (4.3)

public class Cat
{    
    ...
    public override bool Equals(object other)
    {
        if (this == other) return true;

        Cat cat = other as Cat;
        if (cat == null) return false; // null or not a cat

        if (Name != cat.Name) return false;
        if (!Birthday.Equals(cat.Birthday)) return false;

        return true;
    }

    public override int GetHashCode()
    {
        unchecked
        {
            int result;
            result = Name.GetHashCode();
            result = 29 * result + Birthday.GetHashCode();
            return result;
        }
    }    
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 NHibernate 在选择时删除然后插入复合元素? 的相关文章

随机推荐

  • 什么是 CLR 托管?

    什么是 CLR 托管 其用途是什么 See here http msdn microsoft com en gb library 9x0wh2z3 aspx有关与 CLR v2 NET 2 0 3 0 和 3 5 相关的 CLR 托管的信息
  • 如何在 CSS 中正确定位和缩放这些元素?

    我已经能够使用 html 和 css 正确定位和缩放网页中的一些元素 但是由于定位规则 我陷入了如何使用另外两个元素继续此操作的困境 图片中的 V 形图标必须位于标题为 向下滚动 的最后一段下方 我也希望它能够随屏幕尺寸缩放 正如我已经成功
  • 如何编辑和更新pdf文件?

    我正在使用 ASP NET 开发一个 Web 应用程序 其中一项要求要求我打开包含表单字段的给定 pdf 文件 填写字段 例如选中复选框 从选择输入中选择值以及在文本框中输入文本等 设置字段后 我需要将其提交到服务器并将其另存为新的 pdf
  • PHP 浮点错误与基本数学[重复]

    这个问题在这里已经有答案了 可能的重复 为什么十进制数不能用二进制精确表示 https stackoverflow com questions 1089018 why cant decimal numbers be represented
  • 如何将 MVC 5 IdentityModels.cs 移动到单独的程序集中

    我想知道是否有人遇到了我在尝试搬家时遇到的问题ApplicationUser进入模型项目 所有其他模型都驻留在其中 包括与用户表相关的模型 我的测试 MVC 5 解决方案由一个 Web 项目和两个类库组成 一个用于数据访问层 DAL 另一个
  • C# 和 SQL Server 中嵌套 using 的用法

    这个线程是一个延续是否有理由在 C 中使用子句检查多个内部的 null https stackoverflow com questions 2220422 is there a reason to check for null inside
  • 支持 Edge 浏览器中的滚动条样式

    看起来您可以通过 IE 11 使用 IE 特定的滚动条样式 例如 scrollbar face color scrollbar track color 等 但不能在 Edge 中使用 Edge 有替代方案吗 具体很难知道 没有官方文档 ht
  • 在 Next.js 13 中使用标记为“use client”的提供程序包装整个应用程序

    我正在 Next js 中开发一个小型应用程序 但我还没有完全理解客户端与服务器端渲染的情况 我一直在工作这个伟大的指南 https www misha wtf blog supabase auth next 13 pkce关于使用 Sup
  • 如何将目录路径转换为唯一的数字标识符 (Linux/C++)?

    我正在研究获取目录 文件夹 并派生某种形式的唯一数字标识符的方法 我研究了 字符串到哈希 方法 但是 鸽子洞原理 http www codinghorror com blog 2007 12 hashtables pigeonholes a
  • 切换 git 分支时如何处理 vim 缓冲区?

    因此 我在 vim 缓冲区中打开了大量文件 并且正在使用 git 处理功能分支 突然 我意识到我需要恢复到主分支来进行快速修复 提交后 我将 vim 会话保持打开状态并切换回 master 分支 但是 当我尝试从缓冲区加载我需要的文件时 我
  • 没有要加载的文件——readline(加载错误)

    当我想执行 Rails 3 控制台时 它会抛出以下错误 script rails c usr local rvm rubies ruby 1 9 2 p318 lib ruby 1 9 1 irb completion rb 9 in re
  • 将 css 应用到区域地图

    我创建了一个非常大的地图 其中包含许多多边形区域 每个多边形区域超过 20 个坐标 用于地图内的区域 但是 您无法将 css 添加到 AREA 标记 因为我被告知它不是可见元素 我想要做的是 当用户将鼠标悬停在地图上的某个区域上时 我希望通
  • Java线程池大小(执行器)

    我有一个有 3 个线程的应用程序 我将其切换为由 ScheduledExecutorService 管理 创建此实例时 您必须指定线程池大小 但这是什么 这是否意味着如果我计划运行 3 个任务 我应该为每个任务创建一个大小为 3 的线程池
  • 控制器中的模拟服务器

    我的控制器中有以下行 string lTempPath Path Combine Server MapPath Temp lRandomFileName 问题是服务器不是虚拟的 只能通过 getter 进行访问 I get a 该方法或操作
  • 枚举类型的命名空间 - 最佳实践

    通常 需要同时使用多种枚举类型 有时 人们会发生名字冲突 我想到了两种解决方案 使用命名空间 或使用 更大的 枚举元素名称 尽管如此 命名空间解决方案有两种可能的实现 带有嵌套枚举的虚拟类 或完整的命名空间 我正在寻找所有三种方法的优缺点
  • Haskell 有反向模式自动微分的工作实现吗?

    我见过的 Haskell 中最相关的实现是前向模式http hackage haskell org packages archive fad 1 0 doc html Numeric FAD html http hackage haskel
  • Django 组和权限。扩展组以拥有 FK?

    我正在开发一种产品 允许不同的学校在线管理他们的内容 其中一部分涉及设置我自己编写的基于角色的访问控制逻辑 本质上 每所学校都有自己的一组角色 这些角色拥有自己的一组权限 该软件的用户在任何给定时间都可能属于多个具有不同角色的学校 由于各种
  • 我应该在哪里放置 axis2.xml 以便由带有肥皂客户端的 jar 读取?

    我在 jar 文件中有一个 java 控制台应用程序 它通过调用肥皂服务axis2 http axis apache org axis2 java core 我在用这个博客 http www nandana org 2008 08 want
  • 如何从 C# (ASP.NET) 中的函数返回多个值?

    我有一个页面 其中包含一些产品和用户输入数字的文本字段 我首先使用 JavaScript 来计算总成本 根据他们输入的用户数量 他们会获得不同的费率 如下面的代码所示 当用户在文本字段中键入或粘贴数字时 将调用CalculateCost 函
  • 为什么 NHibernate 在选择时删除然后插入复合元素?

    有人可以向我解释一下关于 NHibernate 如何处理复合元素的这个小谜团吗 我的课程看起来像这样 public class Blog public virtual int Id get private set public virtua