问题标签 [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.

0 投票
1 回答
104 浏览

entity-framework - 如何避免使用为实体框架生成代码的 Microsoft 自定义工具?

微软倾向于提供在 Visual Studio 中生成代码的自定义工具并不总是吸引我。对于实体框架,我想避免使用 Db 上下文模板或创建 edmx 文件。

我不喜欢在 Visual Studio 中生成代码的 Microsoft 自定义工具的原因有很多:

1) 实体框架配置数据库的连接字符串有一些丑陋的元数据代码

2) 当我需要更改日期模型时,我必须更改 edmx 视觉文件。当我想更改数据模型时,我不喜欢将控制权交给某种可视化工具。这似乎是“我无法控制的”?

请告诉我如何手动编码 POCO,以及它们相应的按代码映射来完成它。

0 投票
1 回答
681 浏览

mapping-by-code - MappingException 的原因:没有持久性:MyClassProxy

SaveOrUpdate通话中,我得到了MappingException No persister for: MyClassProxy.

奇怪的是,我可以使用代码插入新行,但如果该行存在并且存储库尝试更新它,我会收到此异常。

在搜索和阅读了很多关于这个异常的问题之后,这并没有帮助我找到原因,我会问自己:如果映射适用于读取/插入数据,有哪些可能的原因会导致这个异常?

关于我的案例的更多信息:

  • 使用 NHibernate 版本3.3.1.4000
  • 映射是由代码(不是流利的)和引用的另一个dll创建的
  • 映射由 aClassMappingSubclassMapping带有鉴别器的 a 组成
0 投票
1 回答
610 浏览

vb.net - Nhibernate 和按代码继承映射

我有两个类,一个继承自另一个。第一个显示数据的摘要视图(4 列以上),子项显示详细视图(40 列以上)。两个类都在访问同一个表并共享被访问的相同列。

我的子类可以从父类继承,所以我只需要在一个地方更改映射吗?我宁愿没有重复的代码猖獗。

例如:

我想做这样的事情:

0 投票
1 回答
698 浏览

postgresql - 在 NHibernate 按代码映射的 SqlInsert 上使用自定义函数时出错

如果在标准 SqlInsert 上使用标准 INSERT,我有一个 NHibernate 代码映射

但是,我想使用 Postgresql 存储过程,因此插入和更新都可以使用相同的例程

但是,当我使用 Postgresql 函数时,它有一个错误:

如果有帮助,这是我的 Postgresql 存储过程:

我也尝试了以下方法,但仍然不走运,它们都有错误:

我应该使用什么来避免错误unexpected row count of -1?谷歌也很难,因为谷歌消除了 -1

0 投票
3 回答
1247 浏览

c# - 在查询中生成错误的列

我们在使用 NHibernate 时遇到了一个间歇性问题,它偶尔会在 SQL 上生成带有错误列的查询。如果我们重新启动应用程序,问题就不会发生(有时需要多次重新启动)。当问题发生时,在该进程的生命周期内,它总是为受影响的实体生成错误的 SQL。它并不总是同一个受影响的实体。

它是一个 ASP.NET 应用程序,其中 SessionFactory 在 Application_Start 事件期间创建。所有的配置和映射都是通过代码完成的。

我们没有更多关于如何测试或调试应用程序的想法,我开始假设 NHibernate 中存在一些错误,因为应用程序在重新启动时会自行修复。任何想法/提示将不胜感激!

这是一个例子:

实体

映射

命令

生成的 SQL

例外

有趣的观察:

  • 它更有可能影响较大的实体(具有更多属性),但偶尔也会影响较小的实体;
  • 生成的 SQL 总是具有与映射属性相同的列数;
  • SQL 上的列与映射类上的映射属性的顺序相同;
  • 错误的列将替换现有的列;
  • 错误的列是不同映射实体中的有效列;
  • 受影响的实体与列错误的实体之间没有关系;

其他详情:

  • .NET 版本: 4.0
  • NHibernate 版本: 3.3.3.400
  • 按代码映射: NHibernate.Mapping.ByCode
  • 代码配置: NHibernate.Cfg

加载映射

会话工厂配置

0 投票
1 回答
3750 浏览

nhibernate - NHibernate 多列多对一映射与 Mapping By-Code

我正在尝试使用 NHibernate 3.3.3 将我的 FluentNHibernate 映射转换为 NHibernate Mapping By-code。目标是升级到 NHibernate 3.3.3 并减少分发的程序集的数量。

但是,当我编译并运行时,出现以下异常:

NHibernate.MappingException:不能通过单列 API 映射多列属性。

XML 映射 FluentNHibernate 看起来像这样:

这是我的新 By-Code 映射:

这是旧的 FluentNHibernate 映射:

对于完整性,所涉及的属性类型:

以及实体中的属性示例:

那么,如何获得以前使用 FluentNHibernate 但使用 NHiberbate 的 Mapping By-Code 获得的 xml 映射?

0 投票
1 回答
8345 浏览

nhibernate - NHibernate 通过代码 ManyToOne 与 CompositeIdentity 进行映射

我正在尝试使用 NHibernate 3.3.3 将我的 FluentNHibernate 映射转换为 NHibernate Mapping By-code。目标是升级到 NHibernate 3.3.3 并减少分发的程序集的数量。我在将 FluentNHibernate 的引用映射转换为多对一映射时遇到了一些麻烦。

我的许多实体都有需要翻译的描述。为此,我使用了一个文本表,其中包含所有可用语言的这些文本。我使用文本 ID 来引用文本表,然后在数据访问对象中过滤所需的语言。这项工作使用 NHibernate 3.1 和 FluentNHibernate 创建,使用 NHibernate 3.3.3 和映射代码但是我只是一个 MappingException 说:属性映射的列数错误:Category.Description 类型:文本。

我的新映射哪里错了?或者这种类型的映射在 NHibernate 3.3.3 中是不可能的。

这是文本表(SQL-server 2008)。

文本类:

例如,这里是 Category 类:

Category 类的 FluentNHibernate xml 映射如下所示:

这是由此产生的:

这是我创建的 NHibernate ClassMapping:

从这里我得到这个xml映射:

0 投票
1 回答
944 浏览

c# - NHibernate - 映射键作为代理返回,急切加载?

我正在使用 NHibernate 通过代码进行映射。这是课程:

这是映射:

问题是,当我尝试访问字典中的键时,键类型是 AttributeTypeProxy。然后,它似乎试图在会话不再存在的代码区域中延迟加载密钥。因此,抛出错误:Initializing[AttributeType#1]-Could not initialize proxy - no Session。

因此,经过一些研究,我被告知我需要强制它急切加载。我没有看到任何与键映射相关的 .Lazy。另外,我已经验证了 Map 的值是预先加载的(我假设这是由于 CollectionLazy.NoLazy)。如何使 Map 急切加载的密钥?


编辑:

为了使其无法按照 Rippo 的回答正确加载属性,我临时更改了 Person 的映射以生成 Attribute 表。

现在,当您按照他的示例尝试访问时person.Attributes,它会给出以下错误:Initializing[Person#1]-failed to lazily initialize a collection of role: Person.Attributes, no session or session was closed

Rippo 还建议发布实际检索数据的代码。我使用这些方法:

在尝试使用 Map 映射 IDictionary 之前,我在使用这些之前没有遇到任何问题。不过,在此之前,我一直只使用属性和 ICollections(通过 Set 映射)。我还应该提到,这用于客户端-服务器应用程序。客户端是一个 MVVM WPF 应用程序,而服务器是一个服务(目前,只是一个控制台应用程序)。


编辑2:

我找到了一种解决方法,但我绝对不会认为这是一个答案。我也不知道它为什么起作用。我能得出的唯一结论是,通过代码映射的 Map 没有发挥作用。这是我所做的更改:

是的。我添加了一个 AttributeType 的 ICollection 来保存字典中的键。它只能从 Attributes 返回实际的键;不过,我需要 NHibernate 的 set 方法才能正确使用它。我只是在方法中什么都没放。

然后,我将其添加到映射中:

这只是创建一个名为 UnusedAttributeTypes 的表,其中包含 PersonId 和 AttributeTypeId。这是一个虚拟表,因为我无法通过我的对象访问。

现在,当我去调用时person.Attributes.Keys,它们不是代理 AttributeType 对象,而是实际对象并且它们被正确填充。此外,person.Attributes.Values他们仍然像以前一样居住。那里没有变化。

我希望我不需要搜索 NHibernate 源代码来找出解决问题的原因,或者实际问题是什么。

编辑 3:删除 c.Cascade(Cascade.All); 来自 AttributeTypes 映射。

0 投票
0 回答
620 浏览

nhibernate - nhibernate 默认情况下进行急切获取

我正在通过代码映射使用 nhibenate。出于某种原因,默认情况下它会进行急切的获取,而它应该是惰性的。

下面是我的映射:

所以我尝试在基类中指定lazy(true),以便所有关系都通过延迟加载完成。

我也按惯例使用映射,其配置如下:

所以我已经尝试了所有的设置让它变得懒惰,但它仍然渴望..

下面是我用来加载数据的查询:

一对多映射指定如下:

请帮忙!!!

添加了上面提到的所有设置以使其延迟加载,最初没有指定任何设置....

0 投票
1 回答
1695 浏览

nhibernate - json.net 在序列化期间忽略 nhibernate 代理对象

我可以使用以下代码序列化代理对象:

但是如何在序列化过程中JSON.NET忽略NHibernate Proxy对象。

我面临的问题是,父对象正在获取 1000 个子对象,而我只想为父对象发送 JSON,所以我想忽略代理对象并只获取急切加载的关系。

如果我对上面的代码进行评论,那么我会收到 JSON.NET 无法序列化代理对象的错误。

请帮忙!