NHibernate:一个基类,几个映射

我对NHibernate比较陌生,但是我已经将它用于最后几个程序并且我很喜欢。 我遇到了需要将4-5个数据库中的数据聚合到一个数据库中的情况。 具体来说,它是序列号数据。 每个数据库都有自己的映射文件,但最终实体都共享相同的基本结构(Serial类)。

我理解NHibernate希望每个类都有一个映射,所以我最初的想法是拥有一个基本的Serial Class,然后为每个不同的数据库inheritance它,并创建一个唯一的映射文件(inheritance的类将没有内容)。 这应该非常适合抓取所有数据并填充对象。 我想要做的是使用基类映射将这些inheritance的类(不确定正确的术语是什么)保存到基类表中。

问题是我不知道如何强制NHIbernate为对象使用特定的映射文件。 使用’session.save()’时,将inheritance的类转换为基类没有任何作用(它抱怨没有映射)。

有没有办法明确指定使用哪个映射? 或者是否只有一些OOP主体我缺少更具体地将inheritance的类转换为基类? 或者这个想法是不好的。

关于NHibernate(第8章)我可以找到的所有inheritance内容似乎都不完全适用于这个函数,但我可能是错的(每个具体类的表看起来可能有用,但我可以’关于NHibernate如何计算出去做的事情,我完全绕过它。

我不知道这是否有帮助,但基本上我不会尝试这样做。

从本质上讲,我认为你可能患有“golder hammer”综合症:当你有一把非常好的锤子(即Hibernate(我和你分享你的看法;它是一个非常好的工具)),一切看起来像钉子。

我通常会尝试简单地使用一个“手动转换”类,即具有构造函数的类,这些构造函数将单独的序列类用于hibernate类,并且只是将数据复制到其自己的特定格式; 然后Hibernate可以使用自己的映射将其序列化到(单个)数据库。

实际上,我认为这是一个更好的解决方案的原因是,你有效地尝试做的是在你的class级中有不对称的序列化; 即从派生类中的一个数据库读取,写入基类中的另一个数据库。 真的,没有什么太可怕了,除了它从根本上说是一个单向的过程; 如果你真的想要从一个数据库转换到另一个数据库,只需进行转换,然后完成转换。

这可能有所帮助;

将NHibernate与多个数据库结合使用

从文章;

介绍

…使用NHibernate和ASP.NET描述; 它提供了与单个数据库通信的指南。 但有时需要同时与多个数据库进行通信。 对于NHibernate来说,需要为要与之通信的每个数据库存在会话工厂。 但是,与多个数据库的情况一样,一些数据库很少使用。 因此,在实际需要之前不要创建会话工厂可能是个好主意。 本文介绍了之前NHibernate与ASP.NET文章的内容,并描述了这种简单方法的实现细节。 虽然前一篇文章侧重于ASP.NET,但ASP.NET和.NET都支持以下建议。

使用多个数据库时要做的第一件事是配置正确的通信。 为每个数据库创建一个单独的配置文件,将它们全部放入中央配置文件夹,然后从web / app.config中引用它们。

我不是100%肯定这会做我需要的,但我今天发现这个谷歌搜索关于NHibernate和匿名类型:

http://infozerk.com/averyblog/refactoring-using-object-constructors-in-hql-with-nhibernate/

有趣的部分(对我来说,我是新手)是HQL select子句中的’new’关键字。 所以我能做的是使用mappingX从DatabaseX中选择SerialX,并将其传递给SerialY的构造函数(通用/基本串行)。 所以现在我从mappingX / databaseX生成了SerialY,并且(希望)我可以使用session.save和NHibernate将使用mappingY / databaseY。

我喜欢这个的原因就是没有两个持有相同数据的类(我想!)。 这与返回SerialX列表之间确实没有function差异,迭代它并生成SerialY并将其添加到新列表(给出的第一个和最佳答案)。

对于带有inheritance的NHibernate映射,这没有更多的一般好处,但我认为它会做我想要的有限的东西。

虽然这是真的,你需要为每个表都有一个映射文件/类,没有什么可以阻止你让所有这些类实现一个公共接口。

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

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

我写了一篇非常长的post,里面有代码和一切回应Dan的post。 结果我认为我错过了显而易见的事实。

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

 Serial serial = sessionX.get(typeof(Serial), someID); sessionY.save(serial); 

NHibernate应该使用mappingX作为保存的get和mappingY,因为会话未被共享,并且映射与会话相关联。 所以我可以有2个映射指向同一个类,因为在任何特定的会话中只有一个映射到类关系。

至少我认为是这样的(不能测试atm)。

不幸的是,这个具体案例真的很无聊而且没用。 在同一域的不同程序中,我从业务逻辑的特定部分的基类派生。 我不想创建一个映射文件,因为它只是为了使一小段代码更容易。 无论如何,由于与我的第一个问题相同的原因,我无法使它在NHibernate中工作,并且确实采用McWafflestix描述的方法来解决它(因为它很小)。

那说我通过谷歌找到了这个:

http://jira.nhibernate.org/browse/NH-662

这是完全相同的情况,它似乎(可能)在NH 2.1+中得到解决? 我还没有跟进它。

(注意:丹,在我的情况下,我从几个数据库中获取,只写一个。我仍然对你对接口的建议感兴趣,因为我觉得这对其他情况来说是一个好主意。你会定义映射到如果我尝试保存一个实现没有映射定义的接口的类,NHibernate会使用接口映射吗?或者我是否必须在映射中为实现接口映射的每个类声明空子字符?)