Нужно указать в конфигурации nhibernate путь к сборке - PullRequest
4 голосов
/ 29 октября 2009

У меня есть решение, которое использует 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 и сгенерировать мою схему.

Ответы [ 2 ]

3 голосов
/ 30 октября 2009

Хорошо, у меня это работает сейчас, но я, возможно, обнаружил ошибку в 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 голос
/ 30 октября 2009

Вы пробовали это:?

var myAssembly = System.Reflection.Assembly.LoadFrom(path);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...