我有一个使用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中交换路径并生成我的模式。
答案 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);