无法在NHibernate中编译映射文档

时间:2015-04-29 03:55:32

标签: c# winforms nhibernate

例外是:

  

无法编译映射文档:WindowsFormsApplication2.Products.hbm.xml

,内部例外是:

  

持久化类Sample.CustomerService.Domain.Products,Sample.CustomerService。找不到域名

我的配置是:

config file ,i could not paste here because of error ,i did not accept all code hare so i put a link here

and this is mapping file.

用于映射的类是

$('[data-toggle="popover"]').popover('hide')

和会话工厂

namespace Sample.CustomerService.Domain
{
    public class Product
    {
        public virtual int Productid { get; set; }
        public virtual string Name { get; set; }
    }
}

当我尝试通过此代码获取记录时

public sealed class SessionFactory
{       
    private static volatile ISessionFactory iSessionFactory;
    private static object syncRoot = new object();

    public static ISession OpenSession
    {
        get
        {
            if (iSessionFactory == null)
            {
                lock (syncRoot)
                {
                    if (iSessionFactory == null)
                    {
                        Configuration configuration = new Configuration();
                        configuration.AddAssembly(Assembly.GetCallingAssembly());
                        iSessionFactory = configuration.BuildSessionFactory();
                    }
                }
            }
            return iSessionFactory.OpenSession();
        }
    }
} 

它给我错误无法编译映射文档,如上所述。 我是hibernate的新手,我在visual studio 2012中通过manage nugget pcakage选项从nugget.org添加了hibernte,它添加了两个dhhibernate和Iesi.collections。请帮我解决这个错误,我提供了所有信息。

2 个答案:

答案 0 :(得分:2)

在您的映射中,您拥有产品,并且您的类名为Product(以单数形式)。所以它应该是:

<class name="Product" table="Products" lazy="true">

BTW,lazy是nhibernate的默认值,因此您可以在映射中省略它。此外,如果表名与表名相同,您也可以省略它,最好将映射文件内容保持在最小值。

答案 1 :(得分:0)

我们需要的是这样的映射:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
    namespace="Sample.CustomerService.Domain" 
    assembly="Sample.CustomerService.Domain"> // expecting same as namespace hre 
    // as the xml sais: class name (C# class name) is Product, not Products
    <class name="Product" table="Products" lazy="true" batch-size="25" >
        // I would also from the beginning suggest to use batch-size="25"

        // name must be equal to C# name, including case sensitivity
        <id name="Productid" column="Product_ID" class="native" />

        // property could be expressed without the column, 
        // if C# name and column name are the same
        <property  not-null="false"  name="Name" />

    </class>    
</hibernate-mapping>

注意:在此处查看有关批量提取的更多信息(batch-size="25" details

现在,如果想要查询它 - 使用HQL,我们应该知道,HQL是建立在我们的C#对象之上的。我们必须使用他们的确切名称:

Chapter 14. HQL: The Hibernate Query Language

  

NHibernate配备了一种非常强大的查询语言(非常有意)看起来非常像SQL。但不要被语法所欺骗; HQL完全面向对象,理解继承,多态和关联等概念。

     

<强> 14.1。案例敏感性

     

查询不区分大小写,但.NET类和属性的名称除外。因此SeLeCT与sELEct与SELECT相同,但Eg.FOO不是Eg.Foo,而foo.barSet不是foo.BARSET。

而且(我会追加)单数与复数必须相符。因为我们有:

public class Product
{
  ...

我们必须像这样查询(很惊讶你能够构建它,因为Products不在代码中,只有Product

using (ISession session = SessionFactory.OpenSession)
{
    //IQuery query = session.CreateQuery("FROM Products");
    var query = session.CreateQuery("FROM Product"); // just Product

    // here again
    //IList<Products> pInfos = query.List<Products>();
    IList<Product> pInfos = query.List<Product>();
    ...