2013-04-26 46 views
0

我是NHibernate的新手,我基于教程:http://nhibernate.info/doc/tutorials/first-nh-app/your-first-nhibernate-based-application.html。所以我有NHibernateHelper:NHibernateHelper - 很多表

public class NHibernateHelper { 
private static ISessionFactory _sessionFactory; 

private static ISessionFactory SessionFactory 
{ 
    get 
    { 
    if (_sessionFactory == null) 
    { 
     var configuration = new Configuration(); 

     configuration.Configure(); 

     configuration.AddAssembly(typeof (Product).Assembly); 

     _sessionFactory = configuration.BuildSessionFactory(); 
    } 

    return _sessionFactory; 
    } 
} 

public static ISession OpenSession() 
{ 
    return SessionFactory.OpenSession(); 
} } 

但我也有实体类别和用户?我是否需要使用代码AddAssembly将每个实体添加到配置?因为当我加入代码:

configuration.AddAssembly(typeof (Product).Assembly); 
configuration.AddAssembly(typeof(Category).Assembly); 

我有错误:

无法编译映射文件:MvcApplication1.Mappings.Product.hbm.xml

+2

请问你可以用你的'Product'类和相关的映射来更新你的问题吗? – mickfold 2013-04-26 10:27:24

回答

0

首先检查你是否已设定了“将所有映射文件(* .hbm.xml)的“构建操作”设置为“嵌入式资源”。这是非常重要的

然后你只需要添加一个调用AddAssembly一次作为NHibernate的非常聪明,通过组装扫描嗅出所有entities映射到所有嵌入式hbm.xml文件..

例如你只需要提供一个包含所有实体装配once: - 只要它们是在同一个组件Product自动

_configuration.AddAssembly(typeof (Product).Assembly);

的NHibernate会发现现在Category(和所有其他)。 HTH

0

您也可以将映射标记添加到web.config中,而不是将其添加到SessionFactory初始化中的代码中。然后,你的代码看起来就像这样:

if (_sessionFactory == null) 
{ 
    var configuration = new Configuration(); 

    configuration.Configure(); 

    _sessionFactory = configuration.BuildSessionFactory(); 
} 

并在Web配置,你将不得不指示组件,其中所有的映射的是,像这样的:

<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2"> 
<session-factory> 
    <property name="connection.provider"> 
    NHibernate.Connection.DriverConnectionProvider 
    </property> 
    <property name="dialect"> 
    NHibernate.Dialect.MsSql2005Dialect 
    </property> 
    <property name="connection.driver_class"> 
    NHibernate.Driver.SqlClientDriver 
    </property> 
    <property name="connection.connection_string"> 
    -- YOUR STRING CONNECTION -- 
    </property> 
    <property name="proxyfactory.factory_class"> 
    NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle 
    </property> 
    <mapping assembly="You.Assembly.Namespace" /> 
</session-factory> 

被重要的配置标签“mapping assembly =”Your.Assembly.Namespace“作为前面提到的另一个贡献者,将每个hbm.xml文件标记为嵌入资源是非常重要的,否则它将是您从未创建过的资源。通过这样做,你只需要创建所有的这个程序集(项目)内部的映射,NH配置时会自动读取这些映射。