This line of code:
cfg.AddFile(@"C:\Users\slyle\Documents\Visual Studio 2015\Projects\Cat\Cat\Models\Cat.hbm.xml");
Throws this error:
An exception of type 'NHibernate.MappingException' occurred in NHibernate.dll but was not handled in user code
Additional information: Could not compile the mapping document: C:\Users\slyle\Documents\Visual Studio 2015\Projects\Cat\Cat\Models\Cat.hbm.xml
Why?
It is as if AddFile() can't find C:\Users\slyle\Documents\Visual Studio 2015\Projects\Cat\Cat\Models\Cat.hbm.xml
In fact, if I intentionally inject a typo in the path to the file I get the same error.
However this line of code, immediately preceding AddFile(), doesn't have any problems.
cfg.Configure(@"C:\Users\slyle\Documents\Visual Studio 2015\Projects\Cat\Cat\Models\hibernate.cfg.xml");
I also find if I define the configuration in Web.config then there isn't any trouble.
If I don't include the path-file literal in Configure() then the hibernate.cfg.xml file will successfully be searched for and found in the bin\ folder ~ kind of as a undocumented default.
But <mapping>.hbm.xml file/s are not afforded the same bin\ folder courtesy.
Understand this is code from the "QuickStart" taken right off of the nHibernate website
and I have literally tried to many ways to get this to work that I'm resorting to you, my 4th level of support.
I understand by documentation and by construction nHibernate confguration() has about 12 different ways to load mappings.
And I'd like to believe if one works then all others will work alike. Personally I believe the "Embedded Resource" option is contrary to flexibility and therefore contrary good application management.
Sadly, the "Embedded Resource" option seems to be the only way to make nHibernate work.
And worse than all this is poor error reporting.
Shortcomings and underdevelopment all really buts enterprise adoption of nHibernate into question.
Is this thing really meant to be something - or is it only a toy?
-----
This is the mapping file:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="QuickStart" assembly="QuickStart">
<class name="Cat" table="Cat">
<!-- id name="Id"><column name="ID" sql-type="int" not-null="true" /><generator class="identity" /></id -->
<id name="Id"><column name="CatId" sql-type="char(32)" not-null="true"/><generator class="uuid.hex" /></id>
<property name="Name"><column name="Name" length="16" not-null="true" /></property>
<property name="Sex" />
<property name="Weight" />
</class>
</hibernate-mapping>
-----
-----
This is the c# model:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace QuickStart
{
public class Cat
{
private string id;
private string name;
private char sex;
private float weight;
public Cat(){}
public virtual string Id { get { return id; } set { id = value; } }
public virtual string Name { get { return name; } set { name = value; } }
public virtual char Sex { get { return sex; } set { sex = value; } }
public virtual float Weight { get { return weight; } set { weight = value; } }
}
}
-----
-----
And this is the table DDL:
CREATE TABLE [dbo].[Cat](
[CatId] [char](32) NOT NULL,
[Name] [nvarchar](16) NOT NULL,
[Sex] [nchar](1) NULL,
[Weight] [real] NULL,
CONSTRAINT [PK_Cat] PRIMARY KEY CLUSTERED
(
[CatId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
-----