需要为nhibernate配置提供程序集的路径

时间:2009-10-29 14:25:39

标签: c# nhibernate schema

我有一个使用NHibernate根据映射文件生成db模式的解决方案。我试图将该功能从解决方案中删除,以便它可以用作独立的控制台应用程序。我能够像这样提供映射文件的路径:

        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中交换路径并生成我的模式。

2 个答案:

答案 0 :(得分: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并将它们移动到我的app目录,然后在生成模式后删除它们。如果有人有任何进一步的建议我会向他们开放。

答案 1 :(得分:1)

你试过这个:?

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