【问题标题】:NHibernate cannot compile mapping fileNHibernate 无法编译映射文件
【发布时间】:2016-07-14 20:39:04
【问题描述】:

我真的不喜欢发布这样的问题,试图寻找一个错误,可能我错过了一些非常简单的东西,但我刚开始学习 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 ----> System.IO.DirectoryNotFoundException : Não foi possível 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:

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

我在这里错过了什么?

【问题讨论】:

  • Panorama.hbm.xml 有哪些值属性?构建操作并复制到输出目录?您必须在输出目录中搜索该文件
  • 设置为嵌入式资源并始终复制
  • 您可以将 Build Action 属性更改为“content”吗?当你编译它时,用你的 xml 配置文件在输出目录中创建一个文件夹

标签: c# nhibernate


【解决方案1】:

我发现了问题:

1) 使用 Resharper 运行测试时,它使用称为组件影子副本 (Unit testing with Resharper) 的东西并将程序集复制到另一个文件夹以运行它们。

2) .hbm.xml 文件被设置为嵌入资源并被复制到其项目输出路径中,而 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);
}

【讨论】:

  • 我也有同样的问题,这样解决了我的问题,谢谢!!
猜你喜欢
  • 1970-01-01
  • 2014-12-16
  • 2017-06-21
  • 1970-01-01
  • 2012-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多