问题标签 [mapping-by-code]
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.
nhibernate - 具有父类的类有很多项目 - 不可能通过代码映射
我遇到了 nHibernate 的问题:如果一个实体继承自一个基本实体,那么这个子实体不能被另一个实体引用。
我的数据库中有一个继承层次结构,如下所示:
VideoFeed
是一个VisualFeed
VideoFeed
有很多PlaylistAssignment
这是(转述的)SQL 定义
和类定义
VisualFeed
这是(父类)的映射代码:
这是映射代码VideoFeed
:
以及“PlaylistAssignment”的映射代码:
调用时会抛出异常ModelMapper.CompileMappingForAllExplicitlyAddedEntities
。
在文件KeyMapper.cs中的 nHibernate 代码中引发异常:
ownerEntityType
等于“VideoFeed”,并且两者都ReflectedType
等于DeclaringType
“VisualFeed”(父类名称)。即使这一切都是正确的,也会ArgumentOutOfRangeException
被抛出。
谁能想到解决方法?
稍后编辑此问题是由对setPropertiesMapper
. 它实际上是在我从问题中省略的另一个子类上(在简化问题的错误尝试中)。
真正的罪魁祸首是映射到下面的“cms_VisualFeedAssignment”:
当我注释掉PropertyRef
电话时,它起作用了。
nhibernate - NHibernate: cannot resolve inherited id property
I have the entity defined below:
And here's the base class:
I'm going to map the "Id" property as a "composite key", so I've added the following mapping class:
And that's all pretty nice, but I get an error with the following querying attempt:
The error I get is: NHibernate.QueryException : could not resolve property: Id of: Foo
It's quite strange, because by removing the base class and encapsulating everything within "Foo", it works like a charm. Thanks in advance.
nhibernate - 插入新的 NHibernate 实体并立即分配给父级
我的 Oracle 数据库中有父对象和子对象 BOOKLET 和 DEMOGRAPHICS_INFO,在我的数据层中映射如下:
我故意省略了与小册子的 DemographicsInfo 关系,因为我不需要遍历我的实体那个方向。ManyToOne 关系实际上是一对一的。
我编写了一个测试,以确保我可以创建一个 DemographicsInfo 并立即将其分配给它的父 Booklet,它看起来像这样:
当我调用 Save() 时,我得到以下异常:
这是因为在 Insert() 时没有为 demInfo 对象指定 Id。我的插入实现如下所示:
其中 _session 是一个 NHibernate ISession。因为我已经保存了新实体(它成功保存)并刷新了我的会话,所以我希望我的 demInfo 变量有一个 Id,但它仍然为 0,当我尝试保存我的父对象时,这违反了外键。我在这里忽略了一步吗?我应该重新考虑将新孩子添加到现有父母的模式吗?
nhibernate - 如何使用 NHibernate 3.2 的 NHibernate Mapping-By-Code 功能映射 ntext?
我需要使用 NHibernate 3.2 中的按代码映射功能映射表的 ntext 列,这样它就不会被截断为 4000 个字符。
在以下示例中我需要更改什么?“注释”是 sql 表中具有 ntext 类型的属性:
属性(emp => emp.Notes);
注意:请不要将它与流畅的 NHibernate 或 hbm 文件映射混合使用。
c# - NHibernate - 映射接口或抽象组件与按代码映射/一致性
这个问题与映射接口或抽象类组件有关 我也在尝试映射声明为接口的组件,但我使用的是内置的按代码映射/符合标准的方法。
假设我有一个实体Login
(C#):
我想抽象出密码的存储方式,所以我定义了一个简单的接口IPassword
一个示例实现是HashedPassword
:
我想映射Login.Password
为一个组件,而不是多对一或一对一的关系。使用 XML 我会像这样映射它:
这按预期工作。
这是我尝试使用 NHibernate 的内置按代码映射工具对其进行映射的尝试:
当我使用此映射时,出现以下异常:
NHibernate.MappingException:找不到成员。IPassword 类型中不存在成员“Salt”
虽然 Salt 确实不是 的成员IPassword
,但它是我设置的类的成员comp.Class<HashedPassword>()
你知道我如何在不出现异常的情况下映射这个场景吗?
到目前为止,我还没有找到问题本身的解决方案。目前有两种解决方法:
求助于 XML 映射或 FluentNHibernate。这可能仅适用于“有问题的”映射。
使用用户类型而不是组件。这就是我现在正在做的事情。我的类型(散列密码)是不可变的,可以存储为单列,因此用户类型相当简单。
这是我当前使用的用户类型(为了完成)。我使用 PBKDF2 创建安全哈希。请注意,在我的应用程序中,所有数据(盐、哈希和 PBKDF2 迭代计数)都存储在Hash
HashedPassword 的一个属性(简称为 )中。
所需的映射相对简单:
nhibernate - NHibernate 版本控制 - 调用 ISession.Save 后出现异常
在发布这个问题之前,我已经看过很多关于 NH Versioning 的示例,所有这些都告诉我使用下面的代码;我可以使用 MappingByCode 拥有一个版本化实体:
我希望分配 MyVersion 应该由 SQL Server 完成。所以当我调用 ISession.Save 或 ISession.SaveOrUpdate; NProf 显示生成的 sql 不包含传递给 Insert 语句的 MyVersion 参数(如预期的那样),但查询执行失败,因为 SQL Server 没有生成它;结果是cannot insert null value into MyVersion column...
错误。
我对 VersionGeneration.Always 的期望是正确的吗?那么怎么了?
我正在使用 NHibernate 3.3 / SQL Server 2012
nhibernate - nHibernate 映射问题——空,不删除子孙
块引用
我们正在使用 ByCode 方法映射我们的数据..
我有一个 Process (Process 表)对象,它有一个 ProcessStep (ProcessStep 表)对象列表,而该对象又具有一个 Bag of ProcessStepUser (ProcessStepUser 表)对象分配给每个步骤。
对象加载得很好,但是在网页中,如果我从集合中删除一个 Step,将其作为 Process 重新水化为 MVC 操作,然后保存该过程,则数据库中的 Step 只是将 ProcessId 设置为 null ,这会破坏链接,但将步骤留在数据库及其所有分配的用户中。
我想要做的是删除一个 Step 并删除它的 ProcessStep 和它的所有 ProcessStepUsers 。
同样,当我编辑 ProcessStep(比如我更改了步骤的名称)并保存时,它会保存它,但是 ProcessStep 用户被清空(从他们的 ProcessStepId 中)并重新创建,留下孤立的记录。
我在 ProcessStepUser 上也有一列用于整体 ProcessId,这样我就可以防止将用户多次分配给流程的任何步骤。
我的相关映射如下:
过程:
工艺步骤:
流程步骤用户
正如我所说,它在创建时保存得很好,并且在显示时加载得很好。但是删除一个步骤或编辑一个步骤会在数据库中造成严重破坏。
我通过标记它们并在保存 Process master 对象之前手动删除它们来破解步骤删除过程,但如果可能的话,我希望 nhibernate 完成这一切。
谢谢!
块引用
首先感谢 Martin,他发现了 Cascade.All.Include(Cascade.DeleteOrphans)... 的一个问题...这是我拥有的原始代码,我忘记在尝试解决问题时更改了它。
我重写了一些测试,映射实际上工作得很好,所以在这里道歉。我会删除这个问题,但该网站不让我做任何事情(在 Firefox 中),而是编辑......
问题最终是因为我从数据库中获取 Process 对象,然后将其作为 JSON 对象序列化到 View 中。然后我将绑定回 Process 对象的 JSON 对象传回。
总而言之,我们的存储库正在对象上调用 SaveOrUpdate(obj),但由于它已断开连接,我们需要调用 Merge(obj),我们做了并且工作得很好。
我把它留给权力来决定这个问题是否还有任何价值。
谢谢!
c# - 设置十进制标识符的小数位数和精度
我们正在开发一个分布式的、顺序的 ID 生成器,它可以创建一个 96 位的数字 ID。我们在应用程序中为这个值工作的数据类型是decimal
. 在数据库方面,列的数据类型将是decimal(28,0)
.
问题是当我通过代码映射并配置Id时,我无法指定精度和比例。理想情况下,我想要这样的东西:
如果我尝试忽略它,NHibernate 会decimal(28,5)
在创建参数和发出命令时回退到使用,这将不起作用。
我知道有一张票,如果我想在适当的时候做出贡献。与此同时,我需要看看这是否会成功,所以我想知道是否有任何解决方法。自定义类型,破解反序列化的 HBM,诸如此类?
我确实尝试创建自己的派生自 的类型DecimalType
,并且我覆盖了返回 的属性,SqlType
我在其中指定了自己的精度和比例,但这似乎没有任何作用。
c# - 从未映射的抽象中间类继承的连接子类
我有一个在概念上类似于此的类层次结构:
也就是说,有一个抽象基类 ( Relation
) 和几个派生类。在实践中,Customer
共享Supplier
了很多代码,所以我将共同点重构为一个抽象类BusinessContact
。现在实际的类层次结构如下所示:
或在代码中:
我想使用 NHibernate 中的连接子类,使用按代码映射 ( )将此层次结构映射到四个表 ( Relation
、ContactPerson
和)。我的映射如下所示:Customer
Supplier
ModelMapper
但是,一旦我尝试将映射添加到配置中,就会出现异常:
我基本上明白为什么会发生这种情况。生成的映射如下所示:
Customer
并在他们的属性中Supplier
定义,就好像模型中的“正常”实体一样。由于没有 的映射,因此失败,或者当然。请注意,“名称”属性(定义在其中也不会出现在映射中。BusinessContact
extends
BusinessContact
BusinessContact
BusinessContact
我希望映射看起来像这样:
也就是说,创建Supplier
和Customer
扩展 Relation 并包含(否则未映射的)BusinessContact
类的所有映射属性。
我怎样才能做到这一点?
c# - NHibernate:为查询参数显式设置数据类型和长度
我正在通过代码和 sql server 2012 使用 NHibernate 映射。我还在会话工厂中使用 Sql2008ClientDriver 作为驱动程序。我一直在试图弄清楚如何将确切的 sql 类型和长度映射到代表表的 C# 对象。我遇到的问题是生成的 sql 中指定的数据类型,特别是字符串。
例如:
公共虚拟字符串 SomeProperty { get; 放; }
这在生成查询时转换为 nvarchar(4000) 参数,但此列是数据库中的 char(6)。是否可以在映射中指定一些方式?
我相信会有性能损失,因为 sql server 在执行查询之前会进行转换。
我试过这个(它不起作用): http: //notherdev.blogspot.com.au/2012/01/mapping-by-code-property.html
有任何想法吗?