【问题标题】:NHibernate MappingException: Could not compile the mapping documentNHibernate MappingException:无法编译映射文档
【发布时间】:2010-07-15 08:41:07
【问题描述】:

在我的开发网络应用 NHibernate 上运行得很好。当我预编译和部署站点时,在创建 SessionFactory 时我得到一个 MappingException。

以下是跟踪中的一些信息:

NHibernate.Cfg.Environment 2010-07-15 09:20:59,577 [7] 信息 NHibernate.Cfg.Environment [(null)] - NHibernate 2.1.2.4000 (2.1.2.4000) 0.452436832055471 0.232383 NHibernate.Cfg.Environment 2010-07-15 09:20:59,718 [7] 信息 NHibernate.Cfg.Environment [(null)] - 字节码 供应商名称:lcg 0.522780409241957 0.070344 NHibernate.Cfg.Environment 2010-07-15 09:20:59,734 [7] 信息 NHibernate.Cfg.Environment [(null)] - 使用 反射优化器 0.529107470362853 0.006327 NHibernate.Cfg.Configuration 2010-07-15 09:20:59,827 [7] 信息 NHibernate.Cfg.Configuration [(null)] - 映射 资源:Kctc.BusinessLayer.Mappings.StoredWill.hbm.xml 0.623336485503046 0.094229 NHibernate.Dialect.Dialect 2010-07-15 09:21:00,109 [7] 信息 NHibernate.Dialect.Dialect [(null)] - 使用 方言:NHibernate.Dialect.MsSql2008Dialect 0.91570185596214 0.292365 NHibernate.Cfg.Configuration 2010-07-15 09:21:01,390 [7] 错误 NHibernate.Cfg.Configuration [(null)] - 可以 不编译映射文件: Kctc.BusinessLayer.Mappings.StoredWill.hbm.xml NHibernate.MappingException:无法编译映射文档: Kctc.BusinessLayer.Mappings.StoredWill.hbm.xml ---> System.InvalidOperationException:无法生成临时类 (结果=1)。错误 CS2001:源文件 'C:\WINDOWS\TEMP\shp2uoc8.0.cs' 找不到错误 CS2008:未指定输入

在 System.Xml.Serialization.Compiler.Compile(Assembly parent, String ns,XmlSerializerCompilerParameters xmlParameters,证据证据) 在 System.Xml.Serialization.TempAssembly.GenerateAssembly(XmlMapping[] xmlMappings, Type[] types, String defaultNamespace, Evidence evidence, XmlSerializerCompilerParameters 参数,Assembly 程序集, 哈希表程序集)在 System.Xml.Serialization.TempAssembly..ctor(XmlMapping[] xmlMappings, Type[] 类型、字符串默认命名空间、字符串位置、证据 证据)在 System.Xml.Serialization.XmlSerializer.GenerateTempAssembly(XmlMapping xmlMapping,类型类型,字符串 defaultNamespace)在 System.Xml.Serialization.XmlSerializer..ctor(类型类型,字符串 默认命名空间)在 System.Xml.Serialization.XmlSerializer..ctor(类型类型)在 NHibernate.Cfg.XmlHbmBinding.Binder.Deserialize[T](XmlNode 节点)在 NHibernate.Cfg.XmlHbmBinding.MappingRootBinder.Bind(XmlNode 节点) 在 NHibernate.Cfg.Configuration.AddValidatedDocument(NamedXmlDocument doc) --- 内部异常堆栈跟踪结束 --- 2.20609881982207 1.290397 Unhandled Execution Error 无法编译映射文件: Kctc.BusinessLayer.Mappings.StoredWill.hbm.xml 在 NHibernate.Cfg.Configuration.LogAndThrow(异常异常)在 NHibernate.Cfg.Configuration.AddValidatedDocument(NamedXmlDocument doc) 在 NHibernate.Cfg.Configuration.ProcessMappingsQueue() 在 NHibernate.Cfg.Configuration.AddDocumentThroughQueue(NamedXmlDocument 文档)在 NHibernate.Cfg.Configuration.AddXmlReader(XmlReader hbmReader,字符串名称)在 NHibernate.Cfg.Configuration.AddInputStream(流 xmlInputStream, 字符串名称)在 NHibernate.Cfg.Configuration.AddResource(String 路径,装配装配)在 NHibernate.Cfg.Configuration.AddAssembly(Assembly 程序集) 在 Kctc.BusinessLayer.NHibernateSessionFactory.get_SessionFactory() 在 C:\Kctc\Trunk\Kctc.BusinessLayer\NHibernateSessionFactory.cs:第 26 行
在 Kctc.BusinessLayer.NHibernateSessionFactory.OpenSession() 中 C:\Kctc\Trunk\Kctc.BusinessLayer\NHibernateSessionFactory.cs:39 行
在 Developers_Test.ListSquirps(Object sender, EventArgs e) 在 System.Web.UI.WebControls.Button.OnClick(EventArgs e) 在 System.Web.UI.WebControls.Button.RaisePostBackEvent(字符串 事件参数)在 System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(字符串 事件参数)在 System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl,字符串 eventArgument) 在 System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)
在 System.Web.UI.Page.ProcessRequestMain(布尔 includeStagesBeforeAsyncPoint,布尔值 includeStagesAfterAsyncPoint) 2.20665643259129 0.000558

这向我表明映射文件有错误或找不到。但是如果开发应用程序运行良好,那么映射文件在预编译和部署时会出现问题吗?!

有人对这里可能发生的事情有任何建议吗?

谢谢

【问题讨论】:

  • 这是另一个想法。由于 NHibernate 生成代理类,这些是否存储在文件系统中?这可能是文件权限问题吗?

标签: nhibernate exception deployment nhibernate-mapping


【解决方案1】:

好的,我知道了。在创建 SessionFactory 期间调用的 XmlSerializer 类需要对(默认情况下)C:\Windows\TEMP 的写入权限,以便它可以生成一些内容并将其写入其中。

或者,您可以在此博客http://www.hanselman.com/blog/ChangingWhereXmlSerializerOutputsTemporaryAssemblies.aspx 上关注黑客。这将更改 XmlSerializer 存储其 shiznit 的默认位置。您所要做的就是在 web.config / app.config 文件的配置元素中添加以下元素:

<system.xml.serialization>
  <xmlSerializer tempFilesLocation="C:\SomeFolder\SomeOtherFolder\WhereeverYouWant"/>
</system.xml.serialization>

第一个解决方案感觉像是一个安全问题,而第二个解决方案感觉像是一个笨拙的黑客,后果难以预料。

为什么文档记录这么差?

【讨论】:

  • 正如在 gillyb 的回答下的 cmets 中提到的,我实际上是通过使用 FluentNHibernate 解决了这个问题 - 然后根本不需要 XML 文件。
  • + 谢谢谢谢谢谢,我真的花了半天时间在这上面……我以为是温莎生活方式问题,数据库问题……天哪,谢谢! (奇怪的是,这个问题仍然出现在流利的??这就是我正在使用的并且有同样的问题,这解决了它)
  • 您是使用 Fluent for ALL 配置(例如,包括驱动程序信息、数据库平台等)还是仅使用映射配置?换句话说,您是否有任何与配置 NHibernate 相关的 XML?
  • 另外,我只想说安迪,我真的很喜欢阅读你的一些问题。应该有一个“关注”其他用户的选项。
【解决方案2】:

检查 .hbm.xml 文件是否定义为项目中的嵌入式资源。

【讨论】:

  • 是的,但感谢您的建议。我假设 Copy To Output 属性与嵌入式资源无关?
  • 因此请采纳另一个建议 - 开始使用 FluentNHibernate,使用它创建表映射更加容易和舒适! :)
  • 感谢您的提示,gillyb!我听说过 FluentNHibernate,但只想先掌握普通的香草映射。不过看起来确实很酷。
  • 嘿,这意味着没有 XML 文件,没有 XmlSerializer 类,也不需要处理文件权限问题。这可能真的很有用 - 再次感谢。
  • 是的!使用 FluentNHibernate 更舒服,而且更流畅(显然!)。我的一个朋友开始使用它,后来非常感谢。 :)
猜你喜欢
  • 2017-06-21
  • 1970-01-01
  • 1970-01-01
  • 2012-10-27
  • 2014-12-16
  • 1970-01-01
  • 1970-01-01
  • 2019-01-17
  • 2015-05-11
相关资源
最近更新 更多