2009-02-04 92 views
0

我的應用程序同時支持Oracle和MS SQL數據庫,每個數據庫都有略微不同的架構。我遇到的一個問題是在MS SQL下有一個自動遞增主鍵的類,但在Oracle下是一個手動插入的主鍵。使用嵌入式資源加載NHibernate編程映射文件

眼下,這兩個不同的映射類是這樣的:

甲骨文:

<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(); 

回答

2

我可能會丟失你的要害。 NHibernate在如何將映射文件提供給它時​​非常靈活。例如

cfg.AddInputStream(assembly.GetManifestResourceStream("MyNamespace.MyEmbeddedresource.hbm.xml")); 

或定製XML字符串:

cfg.AddXml(myCustomBuildXmlString); 

您也可以通過編程直接添加映射,但是這是一個有點棘手。