NHibernate无法编译映射文件

时间:2016-07-14 20:39:04

标签: c# nhibernate

我真的不喜欢发布这样的问题,试图寻找一个错误,可能我错过了一些非常简单的东西,但我刚刚开始学习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文件夹。

我的解决方案是这样组织的:

enter image description here

所以你可以看到PanoMeasurer.Core.Domain程序集存在且Panorama类位于那里。

我的映射文件设置为EmbededResource:

enter image description here

我还应该告诉我,我正在使用Nhibernate最新的Nugget版本。

我在这里缺少什么?

1 个答案:

答案 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);
}