2013-01-23 45 views
2

enter image description here 我有一個數據庫,hbm映射文件和位於類庫的App.config。現在從一個測試項目引用該庫並嘗試調用我創建的HibernateHelper類,在運行時引發以下錯誤:如何解決NHibernate.MappingException

NHibernate.MappingException:無法編譯映射文檔:HibernateExample.Mappings.Products.hbm .xml

請注意,這是一個正在從Test項目引用的類庫。 如果我將其輸出類型更改爲控制檯應用程序,它運行良好。但是,當我將其更改回類庫並從我的測試項目中引用它時,會引發上述提及錯誤。

我試着添加config.Configure(),但是引發了一個NhibernateDuplicateMapping異常。

修復: 通過從appconfig中刪除來修復複製映射問題。並通過在我的Test項目中放置一個hibernate.cfg.xml文件來修復問題映射實體。


public sealed class NHibernateHelper 
{ 
    private static ISessionFactory _sessionFactory; 
    const string Connectionstring = "servicestring"; 

    public static void OpenSession() 
    {  
     var config = new Configuration();       
     config.Configure(); 
     config.AddAssembly(Assembly.GetCallingAssembly());  
     _sessionFactory = config.BuildSessionFactory(); 

    } 

    public static ISession GetCurrentSession() 
    { 
     ISession session = null; 
     if (_sessionFactory == null) 
      OpenSession(); 

     if (_sessionFactory != null) 
     { 
      session = _sessionFactory.OpenSession(); 
     } 

     return session; 
    } 

    public static void CloseSessionFactory() 
    { 
     if (_sessionFactory != null) 
     { 
      _sessionFactory.Close(); 
     } 
    } 


    // var dsn = ConfigurationManager.ConnectionStrings[Connectionstring].ConnectionString; 
    //config.SessionFactory().Integrate.Using<MsSqlCeDialect>().Connected.ByAppConfing(dsn); 
    // System.Diagnostics.Debug.WriteLine("My connection string: "+dsn); 
    //Get NHibernate configuration 
    //_sessionFactory = config.BuildSessionFactory(); 
    //config.AddAssembly("HibernateExample"); 
} 

任何想法?

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
    <section name="hibernate-configuration" type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate" /> 
    </configSections> 
    <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2" > 
    <session-factory> 
     <property name="connection.driver_class"> NHibernate.Driver.SqlServerCeDriver</property> 
     <property name="dialect">NHibernate.Dialect.MsSqlCeDialect</property> 
     <property name="connection.connection_string">Data Source=FirstSample.sdf;</property> 
     <property name="show_sql">true</property> 
     <mapping assembly="HibernateExample"/> 
    </session-factory> 
    </hibernate-configuration> 


    <connectionStrings> 
     <add name="testconnectionstring" 
      connectionString="Data Source=|DataDirectory|\FirstSample.sdf;Integrated Security=True" 
      providerName="Microsoft.SqlServerCe.Client.3.5" /> 
    </connectionStrings> 

    <runtime> 
    <assemblyBinding xmlns="urnchemas-microsoft-com:asm.v1"> 
     <dependentAssembly> 
     <assemblyIdentity name="System.Data.SqlServerCe" publicKeyToken="89845DCD8080CC91" culture="neutral"/> 
     <bindingRedirect oldVersion="0.0.0.0-9.0.242.0" newVersion="3.5.0.0"/> 
     </dependentAssembly> 
    </assemblyBinding> 

    </runtime> 
</configuration> 

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="HibernateExample" namespace="HibernateExample.Domain" > 
    <class name="Product" table="Products"> 
    <id name="Id" type="integer"> 
     <generator class="identity"/> 
    </id> 
    <property name="Name" type="string"/> 
    <property name="Category" type="string"/> 
    <property name="Discontinued" /> 
    </class> 
</hibernate-mapping> 

拋出異常:

Test 'NunitTest.TestClass.canquerydb' failed: NHibernate.MappingException : Could not compile the mapping document: HibernateExample.Mappings.Products.hbm.xml 
    ----> System.InvalidOperationException : Could not find the dialect in the configuration 
    at NHibernate.Cfg.Configuration.LogAndThrow(Exception exception) 
    at NHibernate.Cfg.Configuration.AddDeserializedMapping(HbmMapping mappingDocument, String documentFileName) 
    at NHibernate.Cfg.Configuration.ProcessMappingsQueue() 
    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 NHibernate.Cfg.Configuration.AddAssembly(String assemblyName) 
    NHibernateTest\NHibernateHelper.cs(21,0): at HibernateExample.NHibernateTest.NHibernateHelper.openSession() 
    NHibernateTest\NHibernateHelper.cs(28,0): at HibernateExample.NHibernateTest.NHibernateHelper.GetCurrentSession() 
    TestClass.cs(21,0): at NunitTest.TestClass.canquerydb() 
    --InvalidOperationException 
    at NHibernate.Dialect.Dialect.GetDialect(IDictionary`2 props) 
    at NHibernate.Cfg.Configuration.AddDeserializedMapping(HbmMapping mappingDocument, String documentFileName) 
+0

你能後的products.hbm.xml文件呢? – Rippo

+0

@Rippo。發佈它。 – Fabii

+0

從初看起來,它看起來不錯,檢查命名空間是否正確,並檢查Product類是否在相同的命名空間中。 – Rippo

回答

1

從錯誤,看來你是不是添加映射之前配置Dialect。這是必需的。

下面是一段簡單的基本配置代碼:

var configuration = new Configuration(); 
configuration.SessionFactory().Integrate.Using<MsSql2012Dialect>() 
             .Connected.ByAppConfing("connName");//sic 
//now you can add the mappings 
+0

不是屬性聲明: NHibernate.Dialect.MsSqlCeDialect照顧嗎? – Fabii

+0

如果你想堅持XML配置(我沒有,因此示例代碼),當我調用configuration.Configure()時,仍然需要調用'configuration.Configure()' –

+0

它給了我一個NHibernate.DuplicateMappingException例外。 – Fabii