【问题标题】:C# & NHibernate "Could not compile the mapping document" on windows serviceWindows 服务上的 C# 和 NHibernate“无法编译映射文档”
【发布时间】:2012-10-27 11:22:30
【问题描述】:

这是我在这个页面上的第一个问题,所以首先对新手的错误和我的英语不好表示抱歉。

如果我没有想尽办法解决我的问题,我不会在这样的页面上提问,所以我希望我能在你的帮助下让它工作,因为这是我最后的机会。

我使用 NHibernate 在 C# 中创建了一个程序,以将其连接到我的 Oracle 数据库(运行良好),现在我被告知要创建一个类似的程序,但现在是在 Windows 服务而不是 .exe 中。

问题是我已经完成了所有设置,以使 NHibernate 像在 .exe 程序中一样工作,如果我调试程序一切正常,但是一旦我安装并运行该服务,它就会停止工作。

我没有在程序中做任何事情,只是测试 NHibernate 连接。

例外:

Could not compile the mapping document: Mapping\CSB_Mensaje.hbm.xml
System.IO.DirectoryNotFoundException: No se puede encontrar una parte de la ruta de acceso 'C:\Windows\system32\Mapping\CSB_Mensaje.hbm.xml'.
   en System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   en System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath)
   en System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize)
   en System.Xml.XmlDownloadManager.GetStream(Uri uri, ICredentials credentials, IWebProxy proxy, RequestCachePolicy cachePolicy)
   en System.Xml.XmlUrlResolver.GetEntity(Uri absoluteUri, String role, Type ofObjectToReturn)
   en System.Xml.XmlTextReaderImpl.OpenUrlDelegate(Object xmlResolver)
   en System.Threading.CompressedStack.runTryCode(Object userData)
   en System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData)
   en System.Threading.CompressedStack.Run(CompressedStack compressedStack, ContextCallback callback, Object state)
   en System.Xml.XmlTextReaderImpl.OpenUrl()
   en System.Xml.XmlTextReaderImpl.Read()
   en System.Xml.XmlTextReader.Read()
   en System.Xml.XmlCharCheckingReader.Read()
   en System.Xml.XsdValidatingReader.Read()
   en System.Xml.XmlLoader.Load(XmlDocument doc, XmlReader reader, Boolean preserveWhitespace)
   en System.Xml.XmlDocument.Load(XmlReader reader)
   en NHibernate.Cfg.Configuration.LoadMappingDocument(XmlReader hbmReader, String name)

西班牙语上的异常部分,说它找不到访问路径的一部分。

尝试执行此代码时抛出此异常:

private static void Init(String BBDD)
    {
        Configuration config = new Configuration();
        config.Configure().SessionFactoryName(BBDD);
        config.AddFile("Mapping\\CSB_Mensaje.hbm.xml");
        config.AddFile("Mapping\\CSB_Periodicidad.hbm.xml");
        config.AddFile("Mapping\\CSB_Plantilla.hbm.xml");
        config.AddFile("Mapping\\CSB_Subscripciones.hbm.xml");
        config.AddFile("Mapping\\CSB_Usuario.hbm.xml");
        config.AddFile("Mapping\\CSB_Login.hbm.xml");
        config.AddFile("Mapping\\CSB_Configuration.hbm.xml");
        _SessionFactory = config.BuildSessionFactory();
    }

这是我的 hibernate.cfg.xml 文件:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
  <session-factory name="Oracle">
    <property name="connection.provider">
      NHibernate.Connection.DriverConnectionProvider
    </property>
    <property name="dialect">
      NHibernate.Dialect.Oracle10gDialect
    </property>
    <property name="connection.driver_class">
      NHibernate.Driver.OracleClientDriver
    </property>
    <property name="connection.connection_string">
      User Id=CSB;
      Password=Hound2012;
      Data Source=(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.30)(PORT = 1521)))(CONNECT_DATA = (SID = HL)));
    </property>
    <property name="show_sql">
      true
    </property>
  </session-factory>
</hibernate-configuration>

再次,这是我第一次在这里提出问题,所以对于所犯的任何错误,我深表歉意。任何帮助将不胜感激。

问候, 霍尔

【问题讨论】:

  • 真的很快,我猜该服务没有读取映射文件的权限。在调试下,您/您自己拥有权限,但您运行服务的任何用户帐户都没有。
  • 实际上我正在使用同一个帐户运行两者,但您的猜测看起来可能是它不起作用的原因,所以我会在没有更好的尝试时进行处理。谢啦。编辑:我尝试使用管理员帐户启动服务,但我得到了同样的错误。

标签: c# oracle nhibernate


【解决方案1】:

这行异常信息表明了问题:

System.IO.DirectoryNotFoundException: No se puede encontrar una parte de la ruta de acceso 'C:\Windows\system32\Mapping\CSB_Mensaje.hbm.xml'.

我认为问题在于您在这里使用了相对路径:

config.AddFile("Mapping\\CSB_Mensaje.hbm.xml");

尝试指定映射文件的实际路径。

或者,将您的映射文件标记为嵌入资源并让 NHibernate 在程序集中找到它们,而不是单独告诉配置(请参阅 The NHibernate Wiki)。

【讨论】:

  • 是的,我知道,问题是在任何程序行中都找不到此路径,我不知道它为什么要尝试访问它。我还尝试使用 xml 创建 Mapping 文件夹,但也不起作用。
  • 在这里,我假设您已经将映射文件部署到 C:\Windows\System32\Mapping。该服务正在尝试使用 System32 作为其工作目录。如果您的映射目录是程序可执行文件的子目录,请专门使用程序的位置System.IO.Path.GetDirectoryName(Assembly.GetEntryAssembly().Location) 来获取正确的路径。
  • 我以为我以前试过这个,但我现在又试了一次,它工作正常。非常感谢特雷弗!!
猜你喜欢
  • 1970-01-01
  • 2017-06-21
  • 1970-01-01
  • 1970-01-01
  • 2014-12-16
  • 1970-01-01
  • 1970-01-01
  • 2012-04-13
  • 1970-01-01
相关资源
最近更新 更多