C# 重写NHibernate属性类型运行时

C# 重写NHibernate属性类型运行时,c#,oracle,nhibernate,C#,Oracle,Nhibernate,是否可以覆盖NHibernate上映射的属性类型(hbm.xml文件,不是fluent) 背景: 我正在开发的应用程序基本上是在SQL Server(遗留数据库模式)上连接的,但它也必须在某些Oracle数据库上工作。我们有很多实体,我们已经放弃保留两个版本的映射文件,因此我们决定定义一个基本映射(SQL Server),并进行一些指导性修改,以便在Oracle上工作(如id生成器、列和表名等) 现在我们遇到了一个关于长Oracle字段(遗留过时字段类型)的新问题,它在NHibernate上不起

是否可以覆盖NHibernate上映射的属性类型(hbm.xml文件,不是fluent)

背景: 我正在开发的应用程序基本上是在SQL Server(遗留数据库模式)上连接的,但它也必须在某些Oracle数据库上工作。我们有很多实体,我们已经放弃保留两个版本的映射文件,因此我们决定定义一个基本映射(SQL Server),并进行一些指导性修改,以便在Oracle上工作(如id生成器、列和表名等)

现在我们遇到了一个关于长Oracle字段(遗留过时字段类型)的新问题,它在NHibernate上不起作用,我们必须定义一个自定义IUserType(),此解决方案与SQLServer兼容,但它需要DLL Oracle.DATACCESS.DLL,为了避免这个有问题的dll,我们将只在Oracle上连接时在运行时设置这个自定义类型。但是属性的成员类型(NHibernate)是只读的,我还没有找到任何方法来设置它


我使用的是NHibernate 3.3。

我们应该区分
ISessionFactory
和NHibernate配置

通常,我们可以根据需要在运行时创建许多配置。此处简要介绍了如何动态执行此操作:

但一旦我们使用配置接收ISessionFactory,则无法更改:

NHibernate.Cfg.Configuration的实例表示应用程序的.NET类型到SQL数据库的一整套映射该配置用于构建(不可变)ISessionFactory。映射是从各种XML映射文件编译而来的


因此,我想说,在这种情况下,我们可以从更多配置(可以非常动态地创建)创建更多工厂。这可以解决问题,基于环境。。。根据某些条件/配置,我们将知道要使用哪个NHibernate配置。。。这将给我们提供合适的工厂

感谢Radim,但是尽管配置“不可变”,我已经更改了一些db参数(id生成器、表和列名等),我认为可以用同样的方式更改属性类型。但是当我在Oracle中时,我会截取配置以手动分配属性的类型,我不想复制和粘贴映射文件,因为我有很多实体(约200个),并且我不能保存所有实体的两个版本。Marc,我建议。。。不要那样做。这不是一条路,不是一条可以维持的路。。。它只会给你带来麻烦。只需使用配置,条件一,为特殊目的创建特殊工厂。会话工厂内的任何内容都不用于外部调整。这是糟糕的。。。和封装。如果新版本内部改变了什么呢?所以如果我能给你建议-创建特殊的动态配置-创建后不要更改工厂。希望能有所帮助…[在我完成之前发送了我的最后一条评论]最后一个问题是:当我在Oracle时,我是否可以截取配置以动态分配属性的类型,我不想复制和粘贴映射文件,因为我有很多实体(约200个),并且我无法保存所有实体的两个版本。我想使用一个基础,并对其进行“特定和集中的”修改。这听起来很合理。。。正是我说的。似乎我们在同一个浪潮上!;)因此,有很多方法,其中之一应该是
configuration.AddDocument(XmlDocument)
,这样我们就可以找到“xmlhbm”文件,更改类型(xml操作),并将调整后的结果传递给
configuration
对象。这可能正是你的方式。。。我想说,只是玩玩。
Configuration
对象确实非常动态。听起来不错,但需要更改当前的通用(sql oracle)配置策略,这是一项艰巨的手工工作。在你的wave开始工作之前,我会等待另一个棘手的解决方案(或奇迹);)