我的應用程序同時支持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();