2009-10-29 93 views
4

我有一個使用NHibernate根據映射文件生成數據庫模式的解決方案。我試圖將該功能從解決方案中分離出來,以便它可以用作獨立的控制檯應用程序。我可以提供一個路徑映射文件像這樣:需要爲程序集提供nhibernate配置路徑

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

     /**/ 
     Assembly contractsAssembly = Assembly.LoadFrom(@"C:\Data\Development\NHibernateTestMappings\Source\DomainModel\Core\bin\Debug\NHibernateTestMappings.Core.Contracts.dll"); 
     Assembly assembly = Assembly.LoadFrom(@"C:\Data\Development\NHibernateTestMappings\Source\DomainModel\Core\bin\Debug\NHibernateTestMappings.Core.dll"); 
     cfg.AddAssembly(contractsAssembly); 
     cfg.AddAssembly(assembly); 
     /**/ 


     DirectoryInfo directoryInfo = new DirectoryInfo(@"C:\Data\Development\NHibernateTestMappings\Source\DomainModel\Core\Mappings"); 
     FileInfo[] mappingfiles = directoryInfo.GetFiles("*.hbm.xml"); 
     foreach (FileInfo fi in mappingfiles) 
     { 
      cfg.AddFile(fi.FullName); 
      //cfg.Configure(myAssembly, fi.FullName);     
      //cfg.AddResource(fi.FullName, myAssembly); 
     } 

所以當它到達的地方嘗試添加它抱怨找不到NHibernateTestMappings.Core裝配該文件的點,因爲那裏是我獨立的應用程序的組件的引用,但每個映射文件中包含的程序集的引用:

<class name="NHibernateTestMappings.Core.Store, NHibernateTestMappings.Core" table="STORE" lazy="false"> 

我需要的是提供NHibernate的配置文件路徑,我組裝的DLL,而不是添加方式對它的引用,以便我可以換出app.config中的路徑,並生成我的模式。

回答

3

好的,我現在有這個工作,但是我可能已經發現了一個在nhibernate中的錯誤。下面是來自NHibernate.cfg.Configuration.AddAssembly代碼:

public Configuration AddAssembly(string assemblyName) 
{ 
     log.Info("searching for mapped documents in assembly: " + assemblyName); 
     Assembly assembly = null; 
     try 
     { 
      assembly = Assembly.Load(assemblyName); 
     } 
     catch(Exception e) 
     { 
      log.Error("Could not configure datastore from assembly", e); 
      throw new MappingException("Could not add assembly named: " + assemblyName, e); 
     } 
     return this.AddAssembly(assembly); 
} 

所以Assembly.Load(的AssemblyName)不關心我很高興去尋找路徑,他只是需要的名稱,並試圖尋找爲了它。由於該dll與應用程序不在同一目錄中,因此無法找到它。我現在的解決方案是出去抓取DLL並將它們移到我的應用程序目錄,然後在模式生成後將其刪除。如果有人有任何進一步的建議,我向他們開放。

1

你試過這個嗎?

var myAssembly = System.Reflection.Assembly.LoadFrom(path); 
+0

是的,發佈後嘗試了各種各樣的東西,其中沒有任何工作。我更新了我的代碼以顯示我的最新版本。我也嘗試了一些appdomain的東西,但失敗了,因爲沒有默認的入口點,因爲我的核心是一個DLL而不是一個EXE。 –

+0

這就是爲什麼我建議您使用上面的代碼。 然後你可以打電話: cfg.AddAssembly(muAssembly); 而不是使用字符串的重載,您可以使用下面的代碼: public Configuration AddAssembly(Assembly assembly) 它直接接受一個「Assembly」對象,並決定如何獲取該程序集。擁有一個沒有入口點的班級圖書館應該不是問題。 – Meligy

相關問題