问题标签 [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.
entity-framework - 如何避免使用为实体框架生成代码的 Microsoft 自定义工具?
微软倾向于提供在 Visual Studio 中生成代码的自定义工具并不总是吸引我。对于实体框架,我想避免使用 Db 上下文模板或创建 edmx 文件。
我不喜欢在 Visual Studio 中生成代码的 Microsoft 自定义工具的原因有很多:
1) 实体框架配置数据库的连接字符串有一些丑陋的元数据代码
2) 当我需要更改日期模型时,我必须更改 edmx 视觉文件。当我想更改数据模型时,我不喜欢将控制权交给某种可视化工具。这似乎是“我无法控制的”?
请告诉我如何手动编码 POCO,以及它们相应的按代码映射来完成它。
mapping-by-code - MappingException 的原因:没有持久性:MyClassProxy
在SaveOrUpdate
通话中,我得到了MappingException No persister for: MyClassProxy
.
奇怪的是,我可以使用代码插入新行,但如果该行存在并且存储库尝试更新它,我会收到此异常。
在搜索和阅读了很多关于这个异常的问题之后,这并没有帮助我找到原因,我会问自己:如果映射适用于读取/插入数据,有哪些可能的原因会导致这个异常?
关于我的案例的更多信息:
- 使用 NHibernate 版本3.3.1.4000
- 映射是由代码(不是流利的)和引用的另一个dll创建的
- 映射由 a
ClassMapping
和SubclassMapping
带有鉴别器的 a 组成
vb.net - Nhibernate 和按代码继承映射
我有两个类,一个继承自另一个。第一个显示数据的摘要视图(4 列以上),子项显示详细视图(40 列以上)。两个类都在访问同一个表并共享被访问的相同列。
我的子类可以从父类继承,所以我只需要在一个地方更改映射吗?我宁愿没有重复的代码猖獗。
例如:
我想做这样的事情:
postgresql - 在 NHibernate 按代码映射的 SqlInsert 上使用自定义函数时出错
如果在标准 SqlInsert 上使用标准 INSERT,我有一个 NHibernate 代码映射
但是,我想使用 Postgresql 存储过程,因此插入和更新都可以使用相同的例程
但是,当我使用 Postgresql 函数时,它有一个错误:
如果有帮助,这是我的 Postgresql 存储过程:
我也尝试了以下方法,但仍然不走运,它们都有错误:
我应该使用什么来避免错误unexpected row count of -1
?谷歌也很难,因为谷歌消除了 -1
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
加载映射
会话工厂配置
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 映射?
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映射:
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 映射。
nhibernate - nhibernate 默认情况下进行急切获取
我正在通过代码映射使用 nhibenate。出于某种原因,默认情况下它会进行急切的获取,而它应该是惰性的。
下面是我的映射:
所以我尝试在基类中指定lazy(true),以便所有关系都通过延迟加载完成。
我也按惯例使用映射,其配置如下:
所以我已经尝试了所有的设置让它变得懒惰,但它仍然渴望..
下面是我用来加载数据的查询:
一对多映射指定如下:
请帮忙!!!
添加了上面提到的所有设置以使其延迟加载,最初没有指定任何设置....
nhibernate - json.net 在序列化期间忽略 nhibernate 代理对象
我可以使用以下代码序列化代理对象:
但是如何在序列化过程中JSON.NET
忽略NHibernate Proxy
对象。
我面临的问题是,父对象正在获取 1000 个子对象,而我只想为父对象发送 JSON,所以我想忽略代理对象并只获取急切加载的关系。
如果我对上面的代码进行评论,那么我会收到 JSON.NET 无法序列化代理对象的错误。
请帮忙!