【问题标题】:Override NHibernate Property Type runtime覆盖 NHibernate 属性类型运行时
【发布时间】:2015-03-23 10:12:14
【问题描述】:

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

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

现在我们遇到了 LONG Oracle 字段(LEGACY OBSOLETE FIELD TYPE)的新问题,它在 NHibernate 上不起作用,我们必须定义一个自定义 IUserType (http://sonyarouje.com/2012/11/07/nhibernate-and-oracle-long-varchar-field/),这个解决方案与 SQLServer 兼容,但是它需要 DLL Oracle.DataAccess.dll,为了避免这个有问题的 dll,我们只会在我们连接 Oracle 时在运行时设置这个自定义类型。但是属性的成员类型(NHibernate)是只读的,我还没有找到任何方法来设置它。

我正在使用 NHibernate 3.3。

【问题讨论】:

    标签: c# oracle nhibernate


    【解决方案1】:

    我们应该区分ISessionFactory和NHibernate配置。

    一般来说,我们可以根据需要在运行时创建许多配置。此处简要介绍如何动态执行:

    3.1. Programmatic Configuration

    但是一旦我们使用配置接收ISessionFactory - 它就无法更改:

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

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

    【讨论】:

    • 感谢 Radim,但尽管配置的“不变性”我已经更改了一些 db 参数(id 生成器、表和列名,...),我认为可以更改属性类型以同样的方式。但是当我在 Oracle 中时,我会拦截配置以动态分配属性的类型,我不想复制和粘贴映射文件,因为我有很多实体(约 200 个)而且我不能维护所有实体的 2 个版本。
    • 马克,我建议...不要那样做。这不是方式,不是可以维持的方式……它只会给你带来问题。只需使用配置,条件一,为特殊目的创建特殊工厂。 Session Factory 内部的任何东西都不能用于外部调整。这就是 OOP……和封装。如果新版本在内部改变了一些东西怎么办?所以。如果我可以给你建议 - 创建特殊的动态配置 - 不要在创建后更改工厂。希望对您有所帮助...
    • [我的最后一条评论是在我完成之前发送的] 最后一个问题是:我可以在 Oracle 中截取配置以动态分配属性的类型,我不想复制并粘贴映射文件,因为我有很多实体(约 200 个),而且我无法维护所有实体的 2 个版本。我想使用一个基础,并对其进行“特定和集中”的修改。
    • 这听起来很合理......正是我所说的。看来我们是同一波! ;) 所以,有很多方法,其中一个应该是 configuration.AddDocument(XmlDocument) 所以我们可以找到“xml-hbm”文件,更改类型(xml操作)并将调整后的结果传递给@987654325 @ 目的。这可能正是你的方式......只是玩,我会说。 Configuration 对象真的非常动态..
    • 听起来不错,但需要更改当前常见的 (sql-oracle) 配置策略,而且这是一项艰苦的手工工作。几天后,我将等待另一个棘手的解决方案(或奇迹),然后再处理您的波浪! ;)
    猜你喜欢
    • 2013-04-05
    • 1970-01-01
    • 2014-10-28
    • 2013-09-07
    • 2017-10-14
    • 1970-01-01
    • 1970-01-01
    • 2018-08-31
    • 1970-01-01
    相关资源
    最近更新 更多