2009-10-29 4 views
4

NHibernate를 사용하여 매핑 파일을 기반으로 db 스키마를 생성하는 솔루션이 있습니다. 그 기능을 독립형 콘솔 앱으로 사용할 수 있도록 솔루션에서 분리하려고합니다. 나는과 같이 매핑 파일의 경로를 제공 할 수 있었다 :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"> 

내가 필요하면 추가하는 대신 내 조립의 DLL에 파일 경로를 NHibernate에 구성을하지 않고 제공하는 방법입니다 app.config의 경로를 바꿔서 내 스키마를 생성 할 수 있도록 참조하십시오.

답변

3

좋아, 지금이 작업을하고 있지만, nhibernate에서 버그를 발견했을 수 있습니다. 여기 NHibernate.cfg.Configuration.AddAssembly의 코드는 다음과 같습니다

그래서 Assembly.Load (의 AssemblyName가) 내가 경로를 찾아 갈만큼 좋은 것을 상관하지 않는다 , 그는 단지 이름을 사용하고보고하려고

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); 
} 
그것을 위해. 그 dll은 앱과 같은 디렉토리에 있지 않기 때문에 찾을 수 없습니다. 내 현재 솔루션을 나가서 DLL을 잡고 내 응용 프로그램 디렉토리로 이동 한 다음 스키마가 생성 된 후 제거합니다. 누구든지 더 이상의 제안이 있다면 나는 그들에게 개방되어있다.

1

시도해 보셨습니까?

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

예, 게시 한 후에 여러 가지를 시도했지만 그 중 아무 것도 작동하지 않았습니다. 최신 코드를 보여주기 위해 코드를 업데이트했습니다. 나는 또한 일부 appdomain 물건을 시도했지만 내 코어가 dll과 exe가 아니기 때문에 기본 엔트리 포인트가 없기 때문에 실패했다. –

+0

그래서 위의 코드를 사용하는 것이 좋습니다. 그러면 전화 할게 : cfg.AddAssembly (muAssembly); 공용 구성 AddAssembly (어셈블리 어셈블리) "어셈블리"개체를 직접 받아 들여이 어셈블리를 가져 오는 방법을 결정한 것입니다. 진입 점이없는 assemebly 클래스 라이브러리를 갖는 것은 전혀 문제가되지 않아야합니다. – Meligy

관련 문제