Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

NHibernate.MappingException: Could not compile the mapping document

I'm newbie in NHibernate. I'm trying using this ORM with SQLite. I have the following: 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>

I'm trying to test in 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);
        }
    }
}

In run time the app breaks in the line cfg.AddAssembly(typeof(Product).Assembly); with the message in the popup: Could not compile the mapping document: Stock.Models.Mappings.Product.hbm.xml and in console:

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

If I add a try/catch in Program.cs :

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

I get (console):

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 files are seted as Embedded Resource and Copy Always. Why does not compile the mapping document Stock.Models.Mappings.Product.hbm.xml? Is it a problem of file format or a library dll problem?

like image 435
Cristhian Boujon Avatar asked Jan 08 '13 12:01

Cristhian Boujon


2 Answers

Well, the Stock.Models assembly doesn't exist. The only assembly that exists is Stock, so you need to change your mapping file accordingly:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                  assembly="Stock"
                  namespace="Stock.Models.Classes">
like image 116
Daniel Hilgarth Avatar answered Oct 20 '22 20:10

Daniel Hilgarth


I was getting the same error despite my mapping files being correct.

Turns out the updated assemblies were not present in the C:\inetpub\wwwroot\wss\VirtualDirectories\<port>\bin folder. When I copied them across by hand it worked.

I don't have an explanation as to why they aren't getting copied across yet or even if they should be, I'm only posting this as an answer as it fixed my issue and I haven't seen it documented anywhere else online.

like image 1
RyanfaeScotland Avatar answered Oct 20 '22 19:10

RyanfaeScotland