NHibernate 对象 ID 返回不正确的值

2024-06-19

我正在使用 NHibernate,这不是家庭作业。

假设我检索了一个类型的对象Faculty(假设 XYZ 大学工程学院)来自数据库。它有 5 个与其类型关联的子对象Department根据数据库表,应包含 ID 2、4、5、8 和 9。

我的第一个问题是,我看到关联的对象总是有ID set as 0.

教师 ID 加载正确。

我的第二个问题是,我需要将它们加载到组合框中,并希望选择 ID 为 5 的对象。

如何解决ID设置为0的问题?我不知道为什么会这样。

如何选取ID==5的对象?

教师.hbm.xml

<?xml version="1.0" encoding="utf-8" ?>

<hibernate-mapping
    xmlns="urn:nhibernate-mapping-2.2"
    namespace="UserManagememntApplication.BO"
    assembly="UserManagememntApplication.BO" >

  <class name="Faculty" table="b_Faculty">
    <id column="ID" name="ID" type="System.Int32" >
      <generator class="native" />
    </id>

    <property column="Code" name="Code" />
    <property column="Name" name="Name" />
    <property column="IsActive" name="IsActive" />

    <bag name="DepartmentItems" table="b_Department">
      <key column="FacultyID"/>
      <one-to-many class="Department" />
    </bag>
  </class>
</hibernate-mapping>

部门.hbm.xml

<?xml version="1.0" encoding="utf-8" ?>

<hibernate-mapping
    xmlns="urn:nhibernate-mapping-2.2"
    namespace="UserManagememntApplication.BO"
    assembly="UserManagememntApplication.BO" >

  <class name="Department" table="b_Department">
    <id column="ID" name="ID" type="System.Int32" >
      <generator class="native" />
    </id>

    <property column="Code" name="Code" />
    <property column="Name" name="Name" />
    <property column="IsActive" name="IsActive" />

    <many-to-one name="Faculty" class="Faculty" column="FacultyID" unique="true"  />

    <bag name="TeacherItems" table="b_Teacher">
      <key column="DepartmentID"/>
      <one-to-many class="Teacher" />
    </bag>
  </class>
</hibernate-mapping>

b_教师

CREATE TABLE [dbo].[b_Faculty](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Code] [varchar](50) NOT NULL,
    [Name] [varchar](50) NOT NULL,
    [IsActive] [bit] NOT NULL,
 CONSTRAINT [PK_b_Faculty] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

b_部门

CREATE TABLE [dbo].[b_Department](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [FacultyID] [int] NOT NULL,
    [Code] [varchar](50) NOT NULL,
    [Name] [varchar](50) NOT NULL,
    [IsActive] [bit] NOT NULL,
 CONSTRAINT [PK_b_Department] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

Edit:

学院.cs

public class Faculty : BusinessObject<Faculty>
    {
        public virtual string Code { get; set; }
        public virtual string Name { get; set; }
        public virtual bool IsActive { get; set; }

        public virtual IEnumerable<Department> DepartmentItems { get; set; }
    }

部门.cs

public class Department : BusinessObject<Department>
    {
        public virtual string Code { get; set; }
        public virtual string Name { get; set; }
        public virtual bool IsActive { get; set; }

        public virtual Faculty Faculty { get; set; }

        public virtual IEnumerable<Teacher> TeacherItems { get; set; }
    }

BusinessObject.cs

public abstract class BusinessObject<T> : IBusinessObject where T : BusinessObject<T>
    {
        public int ID { get; set; }

        public static bool operator ==(BusinessObject<T> item1, BusinessObject<T> item2)
        {
            bool same = false;

            if (!object.ReferenceEquals(item1, null) && !object.ReferenceEquals(item2, null))
            {
                if (item1.ID == item2.ID)
                {
                    same = true;
                }
            }

            else
            {
                if (object.ReferenceEquals(item1, null) && object.ReferenceEquals(item2, null))
                {
                    same = true;
                }
            }

            return same;
        }

        public static bool operator !=(BusinessObject<T> item1, BusinessObject<T> item2)
        {
            return !(item1 == item2);
        }

        public override bool Equals(object obj)
        {
            //If "obj" is null, they are obviously not equal.
            if (obj == null)
            {
                return false;
            }

            //If the objects are the same instance, they must be equal.
            if (Object.ReferenceEquals(this, obj))
            {
                return true;
            }

            //If the objects are not the same type, they cannot be equal.
            if (this.GetType() != obj.GetType())
            {
                return false;
            }

            T objCustomer = (T)obj;

            if (this.ID > 0 && objCustomer.ID > 0)
            {
                if (this.ID.Equals(objCustomer.ID))
                {
                    return true;
                }

            }
            return false;
        }

        public override int GetHashCode()
        {
            if (this.ID <= 0)
            {
                return base.GetHashCode();
            }
            else
            {
                return ID.GetHashCode();
            }
        }
    }

教师存储库.cs

public class FacultyRepository : Repository<Faculty>
    {
    }

DepartmentRepository.cs

public class DepartmentRepository : Repository<Department>
    {
    }

存储库.cs

public class Repository<T> : IRepository<T>
    {
        ISession _session;

        public Repository() 
        {
            _session = SessionFactory.GetOpenSession();
        }

        public T Get(object id)
        {
            T obj = default(T);

            try
            {
                if (!_session.Transaction.IsActive)
                {
                    _session.BeginTransaction();
                    obj = (T)_session.Get<T>(id);
                    _session.Transaction.Commit();
                    _session.Flush();
                }
                else
                {
                    throw new Exception(CustomErrorMessage.TransactionAlreadyInProgress);
                }
            }
            catch (Exception ex)
            {
                _session.Transaction.Rollback();
                _session.Clear();

                throw ex;
            }

            return obj;
        }

        public IEnumerable<T> Get(string fieldName, object fieldValue)
        {
            IEnumerable<T> list = null;

            try
            {
                if (!_session.Transaction.IsActive)
                {
                    _session.BeginTransaction();
                    list = (IEnumerable<T>)_session.CreateCriteria(typeof(T))
                        .Add(new NHibernate.Expression.EqExpression(fieldName, fieldValue))
                        .List<T>();

                    _session.Transaction.Commit();
                    _session.Flush();
                }
                else
                {
                    throw new Exception(CustomErrorMessage.TransactionAlreadyInProgress);
                }
            }
            catch (Exception ex)
            {
                _session.Transaction.Rollback();
                _session.Clear();

                throw ex;
            }

            return list;
        }

        public IEnumerable<T> Get()
        {
            IEnumerable<T> list = null;

            try
            {
                if (!_session.Transaction.IsActive)
                {
                    _session.BeginTransaction();
                    list = (IEnumerable<T>)_session.CreateCriteria(typeof(T)).List<T>();
                    _session.Transaction.Commit();
                    _session.Flush();
                }
                else
                {
                    throw new Exception(CustomErrorMessage.TransactionAlreadyInProgress);
                }
            }
            catch (Exception ex)
            {
                _session.Transaction.Rollback();
                _session.Clear();

                throw ex;
            }

            return list;
        }

        public void SaveOrUpdate(T obj)
        {
            try
            {
                if (!_session.Transaction.IsActive)
                {
                    _session.BeginTransaction();
                    _session.SaveOrUpdateCopy(obj);
                    _session.Transaction.Commit();
                    _session.Flush();
                }
                else
                {
                    throw new Exception(CustomErrorMessage.TransactionAlreadyInProgress);
                }
            }
            catch (Exception ex)
            {
                _session.Transaction.Rollback();
                _session.Clear();

                throw ex;
            }
        }

        public void SaveOrUpdate(IEnumerable<T> objs)
        {
            try
            {
                if (!_session.Transaction.IsActive)
                {
                    _session.BeginTransaction();

                    foreach (T obj in objs)
                    {
                        _session.SaveOrUpdate(obj);
                    }

                    _session.Transaction.Commit();
                    _session.Flush();
                }
                else
                {
                    throw new Exception(CustomErrorMessage.TransactionAlreadyInProgress);
                }
            }
            catch (Exception ex)
            {
                _session.Transaction.Rollback();
                _session.Clear();

                throw ex;
            }
        }

        public void Delete(T obj)
        {
            try
            {
                if (!_session.Transaction.IsActive)
                {
                    _session.BeginTransaction();
                    _session.Delete(obj);
                    _session.Transaction.Commit();
                    _session.Flush();
                }
                else
                {
                    throw new Exception(CustomErrorMessage.TransactionAlreadyInProgress);
                }
            }
            catch (Exception ex)
            {
                _session.Transaction.Rollback();                
                _session.Clear();

                throw ex;
            }
        }

        public void Delete(IEnumerable<T> objs)
        {
            try
            {
                if (!_session.Transaction.IsActive)
                {
                    _session.BeginTransaction();

                    foreach (T obj in objs)
                    {
                        _session.Delete(obj);
                    }

                    _session.Transaction.Commit();
                    _session.Flush();
                }
                else
                {
                    throw new Exception(CustomErrorMessage.TransactionAlreadyInProgress);
                }
            }
            catch (Exception ex)
            {
                _session.Transaction.Rollback();
                _session.Clear();

                throw ex;
            }
        }

        public void DeleteAll()
        {
            try
            {
                if (!_session.Transaction.IsActive)
                {
                    _session.BeginTransaction();

                    DetachedCriteria criterion = DetachedCriteria.For<T>();
                    IList<T> list = criterion.GetExecutableCriteria(_session).List<T>();

                    foreach (T item in list)
                    {
                        _session.Delete(item);
                    }

                    _session.Transaction.Commit();
                    _session.Flush();
                }
                else
                {
                    throw new Exception(CustomErrorMessage.TransactionAlreadyInProgress);
                }
            }
            catch (Exception ex)
            {
                _session.Transaction.Rollback();

                throw ex;
            }
        }

        public void Dispose()
        {
            if (_session != null)
            {
                _session.Clear();
                _session.Close();
                _session = null;
            }
        }
    }

SessionFactory.cs

public class SessionFactory
    {
        private static ISessionFactory _sessionFactory = null;
        private SessionFactory(){}

        static SessionFactory()
        {
            if (_sessionFactory == null)
            {
                Configuration configuration = new Configuration();
                configuration.Configure();
                _sessionFactory = configuration.BuildSessionFactory();
            }
        }

        public static ISession GetOpenSession()
        {
            return _sessionFactory.OpenSession();
        }
    }

这就是我的全部了。


一个极其疯狂的猜测。您可以尝试在没有相等比较器和Equals实施并看看是否有帮助,因此采用以下实施:

public abstract class BusinessObject<T> : IBusinessObject where T : BusinessObject<T>
{
    public int ID { get; set; }
}

您可能想要尝试的另一件事是设置ID至私人:

public abstract class BusinessObject<T> : IBusinessObject where T : BusinessObject<T>
{
    public int ID { get; private set; }
}

看看它的效果如何。

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

NHibernate 对象 ID 返回不正确的值 的相关文章

  • boost::asio + std::future - 关闭套接字后访问冲突

    我正在编写一个简单的 TCP 客户端来发送和接收单行文本 异步操作由 std future 处理 以便于超时阻塞查询 不幸的是 我的测试应用程序在破坏服务器对象时因访问冲突而崩溃 这是我的代码 TCP客户端 hpp ifndef TCPCL
  • 如何读取扩展文件属性/文件元数据

    因此 我按照教程使用 ASP net core 将文件 上传 到本地路径 这是代码 public IActionResult About IList
  • 如何修复此错误“GDI+ 中发生一般错误”?

    从默认名称打开图像并以默认名称保存 覆盖它 我需要从 Image Default jpg 制作图形 将其放在 picturebox1 image 上并在 picurebox1 上绘制一些图形 它有效 这不是我的问题 但我无法保存 pictu
  • XamlReader.Load 在后台线程中。是否可以?

    WPF 应用程序具有从单独的文件加载用户控件的操作 使用XamlReader Load method StreamReader mysr new StreamReader pathToFile DependencyObject rootOb
  • 单元测试一起运行时失败,单独运行时通过

    所以我的单元测试遇到了一些问题 我不能只是将它们复制并粘贴到这里 但我会尽力而为 问题似乎是 如果我一项一项地运行测试 一切都会按预期进行 但如果我告诉它一起运行测试 则 1 5 将通过 TestMethod public void Obj
  • 如何访问另一个窗体上的ListView控件

    当单击与 ListView 所在表单不同的表单中的按钮时 我试图填充 ListView 我在 Form1 中创建了一个方法以在 Form2 中使用 并将参数传递给 Form1 中的方法 然后填充 ListView 当我调试时 我得到了传递的
  • 将 System.Windows.Input.KeyEventArgs 键转换为 char

    我需要将事件参数作为char 但是当我尝试转换 Key 枚举时 我得到的字母和符号与传入的字母和符号完全不同 如何正确地将密钥转换为字符 这是我尝试过的 ObserveKeyStroke this new ObervableKeyStrok
  • 无法在 Windows 运行时组件库的 UserControl 中创建依赖项属性

    我想在用户控件内创建数据可绑定属性 这个用户控件包含一个 Windows 运行时组件 项目 我使用下面的代码来创建属性 public MyItem CurrentItem get return MyItem GetValue Current
  • 关于在 Windows 上使用 WiFi Direct Api?

    我目前正在开发一个应用程序 我需要在其中创建链接 阅读 无线网络连接 在桌面应用程序 在 Windows 10 上 和平板电脑 Android 但无关紧要 之间 工作流程 按钮 gt 如果需要提升权限 gt 创建类似托管网络的 WiFi 网
  • 未定义的行为或误报

    我 基本上 在野外遇到过以下情况 x x 5 显然 它可以在早期版本的 gcc 下编译干净 在 gcc 4 5 1 下生成警告 据我所知 警告是由 Wsequence point 生成的 所以我的问题是 这是否违反了标准中关于在序列点之间操
  • 在一个字节中存储 4 个不同的值

    我有一个任务要做 但我不知道从哪里开始 我不期待也绝对不想要代码中的答案 我想要一些关于该怎么做的指导 因为我感到有点失落 将变量打包和解包到一个字节中 您需要在一个字节中存储 4 个不同的值 这些值为 NAME RANGE BITS en
  • 如何将整数转换为 void 指针?

    在 C 中使用线程时 我面临警告 警告 从不同大小的整数转换为指针 代码如下 include
  • PlaySound 可在 Visual Studio 中运行,但不能在独立 exe 中运行

    我正在尝试使用 Visual Studio 在 C 中播放 wav 文件 我将文件 my wav 放入项目目录中并使用代码 PlaySound TEXT my wav NULL SND FILENAME SND SYNC 我按下播放按钮 或
  • gcc 的配置选项如何确定默认枚举大小(短或非短)?

    我尝试了一些 gcc 编译器来查看默认枚举大小是否很短 至少一个字节 强制使用 fshort enums 或无短 至少 4 个字节 强制使用 fno short enums user host echo Static assert 4 si
  • 英特尔 Pin 与 C++14

    问题 我有一些关于在 C 14 或其他 C 版本中使用英特尔 Pin 的问题 使用较新版本从较旧的 C 编译代码很少会出现任何问题 但由于 Intel Pin 是操作指令级别的 如果我使用 C 11 或 C 14 编译它 是否会出现任何不良
  • memset 未填充数组

    u32 iterations 5 u32 ecx u32 malloc sizeof u32 iterations memset ecx 0xBAADF00D sizeof u32 iterations printf 8X n ecx 0
  • Linq-to-entities,在一个查询中获取结果+行数

    我已经看到了有关此事的多个问题 但它们已经有 2 年 或更长 的历史了 所以我想知道这方面是否有任何变化 基本思想是填充网格视图并创建自定义分页 所以 我还需要结果和行数 在 SQL 中 这将类似于 SELECT COUNT id Id N
  • 使用 GROUP 和 SUM 的 LINQ 查询

    请帮助我了解如何使用带有 GROUP 和 SUM 的 LINQ 进行查询 Query the database IEnumerable
  • 检查Windows控制台中是否按下了键[重复]

    这个问题在这里已经有答案了 可能的重复 C 控制台键盘事件 https stackoverflow com questions 2067893 c console keyboard events 我希望 Windows 控制台程序在按下某个
  • 如何正确使用 std::condition_variable?

    我很困惑conditions variables以及如何 安全 使用它们 在我的应用程序中 我有一个创建 gui 线程的类 但是当 gui 是由 gui 线程构造时 主线程需要等待 情况与下面的函数相同 主线程创建互斥体 锁和conditi

随机推荐

  • 由于键更改而尝试插入时外键约束失败

    我有一个 Content 对象 它引用多对多关系中的一组 Tag 对象 作为持久化新内容对象的一部分 我在 PostgreSQL 中查看标签是否已存在 如果存在 则将对其的引用添加到内容对象并尝试保存内容对象 我遇到的问题是 当我这样做时
  • 按空值和非空值分组

    我有一个包含用户 facebook ID 的表 我必须报告谁在使用 facebook 或不使用 对于 facebook 用户 数据行包含一个数字 否则包含 null 我的结果必须是这样的 NbUsers Facebook 1000 no 5
  • benchmem 的输出

    使用内存分析器运行基准测试时 我看到以下输出 SomeFunc 100 17768876 ns op 111 B op 0 allocs op 我不明白输出 0 allocs op 但分配了 111 B 知道这意味着什么吗 我的函数是否在堆
  • Webpack 缺少 CommonsChunk 和 extract-text-webpack-plugin 模块

    我正在跟进Maxime Fabre 的 Webpack 教程 https blog madewithlove be post webpack your bags 我正在尝试获得一个非常简单的 webpack 包 其中包含 1 个入口点和 2
  • SSIS 包卡在“已创建执行”状态

    我最近对我的一个 SSIS 项目部署了更新 自从该项目失败后 它就按计划运行了 SSIS 包似乎停留在 已创建执行 状态 报告中没有任何消息来解释这个问题 我尝试重新部署该项目 但结果保持不变 我最终不得不恢复到早期版本的部署以使系统重新上
  • jQuery UI sortable 和 contenteditable=true 不能一起工作

    我正在创建一个列表并希望使其项目可排序和可编辑 所以我这样做 ul li span A span li li span B span li li span C span li ul ul list sortable http jsfiddl
  • 如何在 R 中为传单中的数值变量设置不对称颜色渐变

    我想让传单调色板以零为中心 红白绿发散 我已经尝试过中所说的这个帖子 https stackoverflow com questions 29262824 r center color palette on 0 当我尝试手动创建颜色时 我得
  • Microsoft Teams 中私人消息的传入 Webhook

    我可以从 C 应用程序或 PS 脚本创建传入 Webhook 将 JSON 消息发送到 MSFT 文档所解释的通道 但是 我想使用传入的 webhook 将 JSON 消息从我的应用程序发送到用户 作为私人消息 就像 Slack 允许的那样
  • 按日期合并多个日志文件,包括多行

    我有几个包含所有以时间戳开头的行的日志 因此以下内容可以按预期合并它们 cat myLog1 txt myLog2 txt sort n gt combined txt 问题是 myLog2 txt 还可以包含没有时间戳的行 例如 java
  • 为什么我们需要 scala 中的特征?

    所以 我试图制作一个 Finagle 服务器 与哨兵交谈 不重要 并偶然发现了一个案例 我需要从两个继承classes 不是特质 同时 我们称它们为class SentryHandler extends Handler and class
  • 如何设置视频分辨率?

    我正在使用 aForge 并尝试设置来自 USB 网络摄像头的视频源的分辨率 以便它正确适合图片框 我的目标分辨率是 800x600 但我得到的默认分辨率约为 640x480 当我尝试设置分辨率时 收到消息 无法修改只读字段的成员 有 aF
  • 如何通过 python 中的函数运行列表?

    我试图通过我创建的函数运行我的列表 但不断收到错误 我不知道出了什么问题 温度 F temp f 19 21 21 21 23 功能 def fahrToCelsius tempFahrenheit return tempFahrenhei
  • 如何在其他核心上运行每个线程?

    我有一个 udp 服务器接收数据并计算它 每个角色我都有两个线程 我的CPU是8个多核 我以不同的速度发送数据 但最多我只使用了 cpu 两核 50 的 14 如果我发送更多的数据值 我的缓冲区将填满并且不会使用更多的CPU 为什么每个核心
  • 如果基于 Spring 注解的控制器位于 jar 文件内,则该控制器无法工作

    我的子模块中有一些基于注释的控制器 这些模块作为 jar 文件部署 jar 文件中基于注释的控制器未加载到 spring 配置中 我使用 Eclipse 中的导出实用程序手动导出 jar 文件 有人遇到过这个问题吗 当您使用 Eclipse
  • 命名管道性能问题

    我使用命名管道进行 C 和 Delphi 之间的过程间通信 C 使用System IO Pipes包 而 Delphi 使用Libby s pipes pas 不幸的是 通信几乎是高性能的 分析显示通信占用了整个运行时间的 72 其余的用于
  • 使用 LAMBDA 在 Excel 中生成所有排列

    这是一个经常被问到和回答的问题 如何在 Excel 中生成所有排列 2011 https stackoverflow com questions 5724373 permutations in excel 2016 https stacko
  • pyCUDA无法打印结果

    最近 我使用 pip 为我的 python3 4 3 安装 pyCUDA 但我在测试示例代码时发现 https documen tician de pycuda tutorial html getting started https doc
  • PHP—array_merge_recursive() - 相同键没有数组

    php a php gt data1 tag gt div classes gt 1 2 3 php gt data2 tag gt section classes gt 2 3 4 5 6 php gt result array merg
  • iOS 自定义滑块删除两端的最小和最大空间

    我正在尝试使用自定义滑块 class MySlider UISlider override func trackRect forBounds bounds CGRect gt CGRect let customBounds CGRect o
  • NHibernate 对象 ID 返回不正确的值

    我正在使用 NHibernate 这不是家庭作业 假设我检索了一个类型的对象Faculty 假设 XYZ 大学工程学院 来自数据库 它有 5 个与其类型关联的子对象Department根据数据库表 应包含 ID 2 4 5 8 和 9 我的