我真的不喜欢发布这样的问题,试图寻找一个错误,可能我错过了一些非常简单的东西,但我刚刚开始学习NHibernate而且我现在正在努力分析这一天找不到问题。
我的域名类:
namespace PanoMeasurer.Core.Domain
{
public class Panorama : EntityBase
{
public virtual double HeadingBase
{
get;
set;
}
}
}
namespace PanoMeasurer.Core.Domain
{
public class EntityBase : IEntity
{
public virtual Guid OID
{
get;
set;
}
}
}
我的Panorama.hbm.xml映射文件:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="PanoMeasurer.Core.Domain"
namespace="PanoMeasurer.Core.Domain">
<class name="Panorama">
<id name="OID" generator="guid.comb"/>
<property name="HeadingBase"/>
</class>
</hibernate-mapping>
我在单元测试中调用的代码:
m_config = new Configuration()
.SetProperty(Environment.ReleaseConnections, "on_close")
.SetProperty(Environment.Dialect, typeof(SQLiteDialect).AssemblyQualifiedName)
.SetProperty(Environment.ConnectionDriver, typeof(SQLite20Driver).AssemblyQualifiedName)
.SetProperty(Environment.ConnectionString, "data source =:memory: ")
.AddFile("Mappings/Xml/Panorama.hbm.xml");
m_sessionFactory = m_config.BuildSessionFactory();
Session = m_sessionFactory.OpenSession();
new SchemaExport(m_config).Execute(true, true, false, Session.Connection, Console.Out);
我在创建新配置时遇到异常:
OneTimeSetUp:NHibernate.MappingException:无法编译映射文档:Mappings / Xml / Panorama.hbm.xml ----&GT; System.IO.DirectoryNotFoundException:Nãopoop能/ localizar uma parte do caminho'C:\ Users \ Rodrigo \ AppData \ Local \ JetBrains \ Installations \ ReSharperPlatformVs14 \ Mappings \ Xml \ Panorama.hbm.xml'。 异常没有堆栈跟踪
据说它无法编译,据我所知,因为它无法在某个路径上找到xml文件。为什么它总是在Resharper文件夹中查找文件?我的项目输出都设置为默认的bin / debug文件夹。
我的解决方案是这样组织的:
所以你可以看到PanoMeasurer.Core.Domain程序集存在且Panorama类位于那里。
我的映射文件设置为EmbededResource:
我还应该告诉我,我正在使用Nhibernate最新的Nugget版本。
我在这里缺少什么?
答案 0 :(得分:1)
我发现了问题:
1)当使用Resharper运行测试时,它使用一个名为Shadow Asse of Assemblies(Unit testing with Resharper)的东西,并将程序集复制到另一个文件夹以运行它们。
2).hbm.xml文件设置为Embeded Resource并被复制到其项目输出路径,Resharper没有使用程序集复制此文件,因此无法在测试执行。
要解决,而不是
.AddFile("/Mappings/Xml/Panorama.hbm.xml");
我用过
.AddFile(AssemblyLocation() + "/Mappings/Xml/Panorama.hbm.xml");
AssemblyLocation从CodeBase属性获取路径:
private string AssemblyLocation()
{
var codebase = new Uri(Assembly.GetExecutingAssembly().CodeBase);
return Path.GetDirectoryName(codebase.LocalPath);
}