问题标签 [nhibernate]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
2911 浏览

c# - NHibernate:传递给 save() 和级联的未初始化代理

我在调用 session.Save() 时不断收到 NHibernate.PersistentObjectException,这是由于传递给 save() 的未初始化代理。如果我摆弄我的级联设置,我可以让它消失,但子对象不会被保存。

我发现的唯一其他解决方法是将以下内容添加到我的 DefaultSaveEventListener。

这显然不是一个理想的解决方案。

有任何想法吗?

0 投票
1 回答
2406 浏览

vb.net - VB.NET 中的泛型函数

我一般不太熟悉泛型(概念或语法)(缺少在集合中使用它们等等),但我想知道以下是否是完成我想要的最佳方式。实际上,我并不完全肯定泛型会在这种情况下解决我的问题。

我已经在 NHibernate 中建模和映射了几十个对象,并且需要某种通用类来进行我的 CRUD 操作,而不是为每种类型创建一个单独的持久类。例如

其中 someObject 可以是不同的类型。我知道这不是最好的方法(或者它甚至会起作用),但我希望有人能引导我朝着正确的方向前进。

0 投票
2 回答
319 浏览

.net - nHibernate,我可以映射到没有每对象行映射的表吗?

我有一个数据库,其中包含一个看起来有点像这样的表:

属性 ID、实体 ID、值

PropertyId 和 EntityId 是组合的主键。每个实体都分布在几行中,其中每一行都包含实体的一个属性。我无法控制这个数据库,所以我必须使用它。

是否可以使用 NHibernate 将此表中的实体映射到单个对象?我只需要从这张表中阅读,这可能会让事情变得更容易一些。还是我最好只使用 DataReaders 并自己进行映射?

0 投票
5 回答
12443 浏览

c# - NHibernate 中的多对多删除级联

我在一个系统中有一个场景,我试图尽可能地简化它。我们有一个(让我们称之为)人工制品表,人工制品可以被任意数量的安全角色访问,安全角色可以访问任意数量的人工制品。因此,我们在数据库中有 3 个表 - 一个描述人工制品,一张描述角色,以及一个将人工制品 ID 链接到角色 ID 的多对多关联表。

在领域方面,我们有两个类——一个用于角色,一个用于人工制品。artefact 类有一个 IList 属性,它返回可以访问它的角色列表。(但是,角色不提供获取可以访问的人工制品的属性)。

因此,人工制品的休眠映射包含以下内容;

这一切都很好,如果我删除了一个人工制品,关联表将被适当地清理,并且删除的人工制品和角色之间的所有引用都被删除(尽管角色没有被正确删除——因为我们不希望删除孤儿)。

问题是 - 如何删除一个角色并让它自动清除关联表。如果我目前尝试删除一个角色,我会得到一个引用约束,因为该角色的关联表中仍有条目。成功删除角色的唯一方法是查询链接到该角色的所有人工制品,从人工制品的角色集合中删除该角色,更新人工制品,然后删除该角色 - 不是很有效或很好,尤其是在联合国 -简化的系统,角色可以与任意数量的其他表/对象相关联。

我需要能够向 NHibernate 提示我希望在删除角色时清除此关联表 - 这可能吗,如果可以的话 - 我该怎么做?

谢谢你的帮助。

0 投票
2 回答
1545 浏览

.net - NHibernate 自定义 SQL 对象创建

稍微简化的示例情况:我有实体 A 和 B,它们是令人难以置信的“重”域对象。从数据库中加载一个非常重要。然后我有一个实体 C,它是一个非常简单的对象,它有一个标签字符串、一个 A 和一个 B——都是惰性的。

我正在做一些低级查询来创建巨大的 C 列表,所以我确切地知道我需要为 CA 和 CB 保存哪些 ID,但我不想加载整个对象并将它们设置为属性,因为开销是疯狂的。

相反,我只想将 ID 直接插入到我的 C 实体中,然后仅在需要时才完全加载其上的 A 和 B 属性。

我在文档中看到了<sql-insert/>标签,但该部分真的很稀疏。

有什么方法可以在 NHibernate 框架内做我想做的事情,还是应该只做原始 SQL?如果可能的话,我试图保持数据库的可移植性,这让我回避了原始选项。似乎必须有一个更好的方法我错过了。

0 投票
2 回答
9957 浏览

nhibernate - nhibernate - 禁用一对多关系的子记录的自动\延迟加载

我想知道是否有一种方法可以禁用 nHibernate 中子记录的自动加载(对于一个:多个关系)。

我们可以轻松地关闭属性的延迟加载,但我想要的是禁用任何类型的自动加载(延迟和非延迟)。我只想通过查询加载数据(即 HQL 或 Criteria )

我仍然想在映射文件中定义父子记录之间的关系以方便 HQL 并能够加入父子实体,但我不希望子记录作为父记录的一部分加载,除非在父记录明确指出(通过急切获取等)。

示例:从数据库中获取部门记录不应从数据库中获取所有员工记录,因为它可能永远不需要。

此处的一种选择是将部门上的员工集合设置为延迟加载。这种方法的问题在于,一旦将对象提供给调用 API,它就可以“触摸”延迟加载属性,并且将从数据库中获取整个列表。

我尝试使用 'evict' - 断开对象,但它似乎并没有一直工作,也没有对对象进行深度驱逐。另外,它使用代理类抽象了延迟加载的属性类型,该代理类稍后会在我们试图通过反射对对象进行操作的代码中造成严重破坏,并且它会在对象上遇到未扩展的类型。

我是 nHibernate 的初学者,任何指示或帮助都会有很大帮助。

0 投票
3 回答
221 浏览

c# - 将字符串集放入表示层

我们正在开发一个使用 C# 编写并使用 NHibernate 将对象映射到数据库的医院信息系统。MVC 模式用于将业务逻辑与 UI 分离。问题来了,

如何将可变大小的不同字符串集传递给 UI?

例如,一个Contact对象有一个名为的属性,该属性City保存了哪个城市联系人居住。在编写应用程序的国家/地区有 80 多个城市。你怎么能把这些城市写到一个组合框中?(或数据网格、表格……)在此示例中,城市编号是固定的。很长一段时间没有必要添加另一个城市。(如果城市列表发生变化,重新编译不是问题)

例如,一个Contact对象有另一个名为的属性FooBar,它将保存 1000 个不同的字符串值,这些值将从该属性的组合框中选择。如果用户愿意,这个集合可以增长。您如何使用这些值加载组合框?(如果字符串列表静态写入组合框对象,重新编译是有问题的)

我有不同的解决方案如下

  1. 在代码或设计器中静态写入组合框的所有字符串值
  2. 从资源文件中获取值
  3. 将这些值写入 XML 文件(实际上与上面相同,但无需重新编译)
  4. 使用 NHibernate创建一个City对象并将值从表中获取到列表中CITY
  5. 创建一个StringHolder具有TypeandValue属性的类。所有字符串值(包括CityFooBar)都将写入一个名为 的表中STRINGHOLDER。并通过 NHibernate 使用“CITY”或“FOOBAR”等键获取这些值。

你会选哪一个?或者你能给我推荐一个吗?

谢谢大家

0 投票
3 回答
1453 浏览

nhibernate - 在 NHibernate 中将多个值映射到值对象

我对 NHibernate 还很陌生,虽然我在网上找到了大量关于 NHibernate 映射的信息,但我太傻了,找不到这条信息。

所以问题是,我有以下模型:

数据模型

这就是我希望它看起来的样子。一个有两个地址属性的干净的人。

在数据库中,我想将其保存在一个表中。所以 Person 行会有一个 ShippingStreetname 和一个 Streetname 列,一个映射到 ShippingAddress.Streetname,另一个映射到 Address.StreetName

我找到了一篇关于 fluent interfaces的文章,但还没有弄清楚如何通过 XML 配置来做到这一点。

提前致谢!

更新:我自己找到了解决方案。这可以通过节点来完成,而且工作相当简单。

为了实现 Address 和 ShippingAddress 的映射,我只需将以下内容添加到

0 投票
3 回答
1647 浏览

c# - 如何使用角色或组合在 NHibernate 中映射类

我相信这是一个常见的问题/问题,但无法找到一个简洁明了的好答案。

问题

如何映射看似具有继承关系的实体:

但是,供应商可以是制造商。

或者

患者可以是医生也可以是员工。

建议:使用角色

在 NHibernate 论坛上的讨论中,反应通常是这是多重继承。

http://forum.hibernate.org/viewtopic.php?t=959076

他们建议的解决方案是使用组合或使用“角色”。但是,我找不到任何关于如何做到这一点的示例或解释。

“有利于组合而不是继承。” 还记得课堂上的那个小礼物吗?在这种情况下,我必须同意您正在尝试多重继承——在 C# 或 Java 中(还)不可能。我个人会鼓励您考虑重新建模,以便您拥有一个 Person 对象,并且一个人拥有一对多的角色集合。

0 投票
2 回答
2330 浏览

c# - NHibernate 自动重命名 C# 中的列名

我不明白为什么 NHibernate 会这样做。

这是我在 MS SQL 中的表的一部分

这是 Person.hbm.xml

在我的 Person.cs 中,我将我的属性命名如下

然后我尝试使用以下代码创建记录

奇怪的是,当我尝试执行它时,NHibernate 实际上通过执行以下操作来更改列名

因此,NHibernate 在这里将我的列名从 NameFamily 更改为 name_family,尽管我确实指定了列名。

这是 NHibernate 错误吗?或者我需要做任何配置吗?

这是我的休眠配置文件

这就是我创建 sessionFactory 的方式