0

私のアプリケーションは、Oracle データベースと MS SQL データベースの両方をサポートしていますが、それぞれにわずかに異なるスキーマが実装されています。私が遭遇した 1 つの問題は、MS SQL では自動インクリメントの主キーを持ち、Oracle では手動で挿入された主キーを持つクラスです。

現在、クラスの 2 つの異なるマッピングは次のようになっています。

オラクル:

<class lazy="false" name="EntityPropertyName" table="entity_property_name" >
<id name="ID" column="id" type="Int32" unsaved-value="-1">
  <generator class="increment" />
</id>
<property name="Name" column="name"/>

MS SQL:

<class lazy="false" name="EntityPropertyName" table="entity_property_name" >
<id name="ID" column="id" type="Int32" unsaved-value="-1">
  <generator class="native">
  </generator>
</id>
<property name="Name" column="name"/>

これは世界で最悪のことではありません。なぜなら、それらを別のマッピング ファイルに入れ、実行時に正しいファイルをロードできるからです。

NHibernate.Cfg.Configuration cfg = new NHibernate.Cfg.Configuration();

            if (newDBType == CompanyName.AppName.Data.Enum.DatabaseType.MsSqlServer)
            {
                cfg.Properties["dialect"] = "NHibernate.Dialect.MsSql2000Dialect";
                cfg.Properties["connection.driver_class"] = "NHibernate.Driver.SqlClientDriver";
                cfg.AddFile("DataTypes\\MSSQLTypes.hbm.xml");
            }
            else
            {
                cfg.Properties["dialect"] = "NHibernate.Dialect.Oracle9Dialect";
                cfg.Properties["connection.driver_class"] = "NHibernate.Driver.OracleClientDriver";
                cfg.AddFile("DataTypes\\OracleTypes.hbm.xml");
            }

            cfg.Properties["connection.provider"] = "NHibernate.Connection.DriverConnectionProvider";

            cfg.Properties["connection.connection_string"] = connectionString;

            cfg.AddAssembly("CompanyName.AppName.Data");

            Sessions = cfg.BuildSessionFactory();

ただし、この戦略の嫌いな点は、プログラムの bin ディレクトリに醜い XML ファイルがいくつかあることです。これらのファイルが存在する必要があり、そうしないとアプリケーションが動作しません。メインのマッピング ファイルと同じように、さまざまなファイルをリソースに埋め込むことができれば、はるかに優れていますが、実行時に各ファイルを読み込むかどうかを選択できます。

これを行う方法、または問題を解決する別の方法はありますか?


編集:ありがとう、クリスティアン!あなたは質問を理解していました.NHibernateがそのようにリソースをロードできることを知りませんでした. 考えてみると、AddAssembly メソッドが検出したリソースを列挙して読み込む何らかの方法が必要になるのは理にかなっていると思います。

私の解決策は次のようになりました:

NHibernate.Cfg.Configuration cfg = new NHibernate.Cfg.Configuration();

            if (newDBType == CompanyName.AppName.Data.Enum.DatabaseType.MsSqlServer)
            {
                cfg.Properties["dialect"] = "NHibernate.Dialect.MsSql2000Dialect";
                cfg.Properties["connection.driver_class"] = "NHibernate.Driver.SqlClientDriver";
                cfg.AddInputStream(Assembly.GetExecutingAssembly().GetManifestResourceStream("CompanyName.AppName.Data.DataTypes.MSSQLTypes.hbm.xml"));
            }
            else
            {
                cfg.Properties["dialect"] = "NHibernate.Dialect.Oracle9Dialect";
                cfg.Properties["connection.driver_class"] = "NHibernate.Driver.OracleClientDriver";
                cfg.AddInputStream(Assembly.GetExecutingAssembly().GetManifestResourceStream("CompanyName.AppName.Data.DataTypes.OracleTypes.hbm.xml"));
            }

            cfg.Properties["connection.provider"] = "NHibernate.Connection.DriverConnectionProvider";

            cfg.Properties["connection.connection_string"] = connectionString;

            cfg.AddInputStream(Assembly.GetExecutingAssembly().GetManifestResourceStream("CompanyName.AppName.Data.DataTypes.Types.hbm.xml"));

            Sessions = cfg.BuildSessionFactory();
4

1 に答える 1