Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NHibernate:一个基类,几个映射_C#_Nhibernate_Oop_Nhibernate Mapping - Fatal编程技术网

C# NHibernate:一个基类,几个映射

C# NHibernate:一个基类,几个映射,c#,nhibernate,oop,nhibernate-mapping,C#,Nhibernate,Oop,Nhibernate Mapping,我对NHibernate比较陌生,但在过去的几个项目中一直在使用它,我很喜欢它。我遇到了这样一种情况:我需要将4-5个数据库中的数据聚合到一个数据库中。特别是序列号数据。每个数据库都有自己的映射文件,但最终所有实体都共享相同的基本结构(串行类) 我知道NHibernate希望每个类都有一个映射,所以我最初的想法是拥有一个基本的串行类,然后为每个不同的数据库从中继承,并创建一个唯一的映射文件(继承的类将没有内容)。这对于获取所有数据和填充对象应该非常有用。然后我想做的是使用基类映射将这些继承的类(

我对NHibernate比较陌生,但在过去的几个项目中一直在使用它,我很喜欢它。我遇到了这样一种情况:我需要将4-5个数据库中的数据聚合到一个数据库中。特别是序列号数据。每个数据库都有自己的映射文件,但最终所有实体都共享相同的基本结构(串行类)

我知道NHibernate希望每个类都有一个映射,所以我最初的想法是拥有一个基本的串行类,然后为每个不同的数据库从中继承,并创建一个唯一的映射文件(继承的类将没有内容)。这对于获取所有数据和填充对象应该非常有用。然后我想做的是使用基类映射将这些继承的类(不确定正确的术语是什么)保存到基类表中

问题是我不知道如何强制NHIbernate为对象使用特定的映射文件。使用“session.save()”时,将继承的类强制转换为基类不会产生任何效果(它抱怨没有映射)

有没有办法明确指定要使用哪个映射?或者我只是缺少一些OOP原则来更具体地将继承的类强制转换为基类?还是这个想法很糟糕


我能找到的关于NHibernate的所有继承内容(第8章)似乎都不完全适用于此函数,但我可能是错的(每个具体类的表看起来可能有用,但我不能完全理解NHibernate是如何决定做什么的)。

我不知道这是否有帮助,但我基本上不会这么做

从本质上说,我认为你可能患上了“金锤综合症”:当你有一把非常漂亮的锤子(即Hibernate(我也同意你的观点,它是一个很棒的工具))时,一切看起来都像钉子

我通常会尝试简单地创建一个“手动转换”类,也就是说,它有一个构造函数,它将hibernate类用于您的单个串行类,并简单地将数据复制到它自己的特定格式;然后Hibernate可以使用自己的映射将其序列化到(单个)数据库

实际上,我认为这是一个更好的解决方案的原因是,您实际上试图在类中实现非对称序列化;i、 e.从派生类中的一个数据库读取,然后写入基类中的另一个数据库。没有什么太可怕的,真的,除了它基本上是一个单向的过程;如果您真的想从一个数据库转换到另一个数据库,只需进行转换,然后完成转换。

这可能会有所帮助

从文章中

导言

。。。 使用NHibernate和 ASP.NET;它提供了指导方针 与单个数据库通信。 但有时有必要 与多个数据库通信 同时。供NHibernate执行 因此,会话工厂需要存在 对于您将访问的每个数据库 与……沟通。但是,正如经常发生的那样 对于多个数据库的情况,有些 大多数数据库很少使用。所以 不创造可能是个好主意 会话工厂,直到它们 实际上需要。这篇文章介绍了 以前的NHibernate在哪里 ASP.NET文章结束并介绍了 该计划的实施细节为何 简单的探测方法。虽然 前一篇文章主要讨论ASP.NET, 以下建议在本报告中得到支持 ASP.NET和.NET

工作时要做的第一件事 使用多个数据库是为了 配置适当的通信。 为每个文件创建一个单独的配置文件 数据库,把它们都放进中央数据库 配置文件夹,然后引用它们 从web/app.config下载。


我不是100%确定这会满足我的需要,但我今天在谷歌上找到了关于NHibernate和匿名类型的信息:

有趣的部分(对我来说,我是新手)是hqlselect子句中的'new'关键字。所以我可以做的是使用mappingX从DatabaseX中选择SerialX,并将其传递给SerialY的构造函数(general/base Serial)。现在我已经从mappingX/databaseX连续生成了,并且(希望)我可以使用session.save和NHibernate来使用mappingY/databaseY

我喜欢这样做的原因很简单,就是没有保存两个具有相同数据的类(我想!)。这与返回一个SerialX列表、遍历它并生成SerialY并将其添加到一个新列表(给出了第一个也是最好的答案)之间实际上没有功能上的区别


这并没有为带有继承的NHibernate映射生成有用的用例的更一般的好处,但我认为它可以实现我想要的有限功能。

虽然确实需要为这些表中的每个表创建一个映射文件/类,但没有什么可以阻止您让所有这些类实现一个公共接口

然后,您可以将它们聚合到应用程序层(即列表)中的单个集合中,其中每个类都实现列表)


如果希望进行更新,您可能需要编写一些管道来跟踪将其存储在哪个会话下(因为您针对的是多个数据库)。但是这样做的过程会根据您的设置方式而有所不同。

我写了一篇很长的文章,其中包含了代码和所有回应Dan的内容。结果我想我错过了显而易见的

public class Serial
{
    public string SerialNumber {get; set;}
    public string ItemNumber {get; set;}
    public string OrderNumber {get; set;}
}

NHibernate应该使用mappingX进行get,使用mappingY进行save,因为会话没有被共享,并且映射与会话绑定。因此,我可以有两个映射指向同一个类,因为在任何特定会话中,只有一个映射到类的关系

至少我认为是这样的(不能)
Serial serial = sessionX.get(typeof(Serial), someID);
sessionY.save(serial);