NHibernate.MappingException:无法编译映射文档

时间:2013-01-08 12:25:07

标签: nhibernate c#-4.0 .net-4.0 nhibernate-mapping

我是NHibernate的新手。我正在尝试将此ORM与SQLite一起使用。 我有以下内容: project

Product.cs

namespace Stock.Models.Classes
{
    class Product
    {
        public virtual string Name {get; set;}
        public virtual int Id { get; set; }
        public virtual decimal Price { get; set; }
        public virtual decimal Quantity { get; set; }
    }
}

Product.hbm.xml

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                  assembly="Stock.Models"
                  namespace="Stock.Models.Classes">
  <class name="Product" table="products">
    <id name="Id">
      <generator class="int" />
    </id>
    <property name="Name" />
    <property name="Price" />
    <property name="Quantity" />
  </class>
</hibernate-mapping>

hibernate.cfg.xml中

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
  <session-factory>
    <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
    <property name="connection.driver_class">NHibernate.Driver.SQLite20Driver</property>
    <property name="connection.connection_string">Data Source=nhibernate.db;Version=3</property>
    <property name="dialect">NHibernate.Dialect.SQLiteDialect</property>
    <property name="query.substitutions">true=1;false=0</property>
    <property name="proxyfactory.factory_class">NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property>
    <property name="show_sql">true</property>
  </session-factory>
</hibernate-configuration>

我正在尝试在Program.cs中进行测试。 的 Program.cs的

namespace Stock
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            //Application.Run(new Form1());
            var cfg = new Configuration();
            cfg.Configure();
                cfg.AddAssembly(typeof(Product).Assembly);
        }
    }
}

在运行时,应用程序在行cfg.AddAssembly(typeof(Product).Assembly);中断,并在弹出窗口中显示消息:Could not compile the mapping document: Stock.Models.Mappings.Product.hbm.xml和控制台:

The thread 'vshost.LoadReference' (0x10a8) has exited with code 0 (0x0).
'Stock.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:\...\Projects\WindowsFormsApplication1\WindowsFormsApplication1\bin\Debug\Stock.exe', Symbols loaded.
'Stock.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:\...\Projects\WindowsFormsApplication1\WindowsFormsApplication1\bin\Debug\NHibernate.dll'
'Stock.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Configuration\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Configuration.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'Stock.vshost.exe' (Managed (v4.0.30319)): Loaded 'jsw3tdap'
'Stock.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:\...\Projects\WindowsFormsApplication1\WindowsFormsApplication1\bin\Debug\Iesi.Collections.dll'
A first chance exception of type 'NHibernate.MappingException' occurred in NHibernate.dll

如果我在 Program.cs 中添加try / catch:

 try
    {
        cfg.AddAssembly(typeof(Product).Assembly);
    }
 catch (Exception e) { Console.WriteLine(e); }

我得到(控制台):

A first chance exception of type 'NHibernate.MappingException' occurred in NHibernate.dll
NHibernate.MappingException: Could not compile the mapping document: Stock.Models.Mappings.Product.hbm.xml ---> NHibernate.MappingException: persistent class Stock.Models.Classes.Product, Stock.Models not found ---> System.IO.FileNotFoundException: Could not load file or assembly 'Stock.Models' or one of its dependencies. El sistema no puede encontrar el archivo especificado.
   at System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
   at System.Reflection.RuntimeAssembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
   at System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection, Boolean suppressSecurityChecks)
   at System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection)
   at System.Reflection.Assembly.Load(String assemblyString)
   at NHibernate.Util.ReflectHelper.TypeFromAssembly(AssemblyQualifiedTypeName name, Boolean throwOnError)
   at NHibernate.Util.ReflectHelper.ClassForName(String name)
   at NHibernate.Cfg.XmlHbmBinding.Binder.ClassForFullNameChecked(String fullName, String errorMessage)
   --- End of inner exception stack trace ---
   at NHibernate.Cfg.XmlHbmBinding.Binder.ClassForFullNameChecked(String fullName, String errorMessage)
   at NHibernate.Cfg.XmlHbmBinding.Binder.ClassForNameChecked(String name, Mappings mappings, String errorMessage)
   at NHibernate.Cfg.XmlHbmBinding.ClassBinder.BindClass(IEntityMapping classMapping, PersistentClass model, IDictionary`2 inheritedMetas)
   at NHibernate.Cfg.XmlHbmBinding.RootClassBinder.Bind(HbmClass classSchema, IDictionary`2 inheritedMetas)
   at NHibernate.Cfg.XmlHbmBinding.MappingRootBinder.AddRootClasses(HbmClass rootClass, IDictionary`2 inheritedMetas)
   at NHibernate.Cfg.XmlHbmBinding.MappingRootBinder.AddEntitiesMappings(HbmMapping mappingSchema, IDictionary`2 inheritedMetas)
   at NHibernate.Cfg.XmlHbmBinding.MappingRootBinder.Bind(HbmMapping mappingSchema)
   at NHibernate.Cfg.Configuration.AddDeserializedMapping(HbmMapping mappingDocument, String documentFileName)
   --- End of inner exception stack trace ---
   at NHibernate.Cfg.Configuration.LogAndThrow(Exception exception)
   at NHibernate.Cfg.Configuration.AddDeserializedMapping(HbmMapping mappingDocument, String documentFileName)
   at NHibernate.Cfg.Configuration.AddValidatedDocument(NamedXmlDocument doc)
   at NHibernate.Cfg.Configuration.ProcessMappingsQueue()
   at NHibernate.Cfg.Configuration.AddDocumentThroughQueue(NamedXmlDocument document)
   at NHibernate.Cfg.Configuration.AddXmlReader(XmlReaThe thread 'vshost.RunParkingWindow' (0x1700) has exited with code 0 (0x0).
The thread '<No Name>' (0x5d4) has exited with code 0 (0x0).
The program '[4428] Stock.vshost.exe: Managed (v4.0.30319)' has exited with code 0 (0x0).
The program '[4428] Stock.vshost.exe: Program Trace' has exited with code 0 (0x0).
der hbmReader, String name)
   at NHibernate.Cfg.Configuration.AddInputStream(Stream xmlInputStream, String name)
   at NHibernate.Cfg.Configuration.AddResource(String path, Assembly assembly)
   at NHibernate.Cfg.Configuration.AddAssembly(Assembly assembly)
   at Stock.Program.Main() in C:\Users\Cristhian\documents\visual studio 2010\Projects\WindowsFormsApplication1\WindowsFormsApplication1\Program.cs:line 25

XML文件被设置为Embedded ResourceCopy Always。为什么不编译映射文件Stock.Models.Mappings.Product.hbm.xml?这是文件格式还是库DLL问题?

4 个答案:

答案 0 :(得分:9)

好吧,Stock.Models程序集不存在。唯一存在的程序集是Stock,因此您需要相应地更改映射文件:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                  assembly="Stock"
                  namespace="Stock.Models.Classes">

答案 1 :(得分:1)

尽管我的映射文件是正确的,但我得到了同样的错误。

原来,C:\inetpub\wwwroot\wss\VirtualDirectories\<port>\bin文件夹中没有更新的程序集。当我手工复制它们时,它起作用了。

我没有解释为什么他们没有得到复制,或者即使他们应该被复制,我只是将其作为答案发布,因为它解决了我的问题并且我没有看到它记录在案其他任何地方在线。

答案 2 :(得分:1)

您应该在hbm.xml file.for中添加程序集和命名空间,以查找使用typeof(yourModel)的名称.Assembly并检查fullName。 大会的名称和类不一样。

答案 3 :(得分:0)

我遇到了同样的问题。它在#34;汇编&#34;和&#34;名称空间&#34;。我所做的就是解决它,就是在你的例子中命名两者,&#34; Stock&#34;。

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                  assembly="Stock"
                  namespace="Stock">