2013-10-17 83 views
0

我一直在打我的頭在牆上的最後幾天,爲什麼我得到這個奇怪的行爲功能NHibernate無法與自動映射用來執行查詢

我已經試過2個以下設置

1:

return _sessionFactory ?? 
    (_sessionFactory = Fluently.Configure() 
     .Database(MySQLConfiguration.Standard.ConnectionString(cs =>cs.Server("127.0.0.1").Database("azeroth").Username("root").Password("password"))) 
     .Mappings(m => m.FluentMappings.AddFromAssemblyOf<Database>()) 
     .BuildSessionFactory() 
    ); 

2:

return _sessionFactory ?? 
    (_sessionFactory = Fluently.Configure() 
     .Database(MySQLConfiguration.Standard.ConnectionString(cs => cs.Server("127.0.0.1").Database("azeroth").Username("root").Password("password"))) 
     .Mappings(m => m.AutoMappings.Add(AutoMap.AssemblyOf<Database>().Where(t => t.Namespace.StartsWith("Azeroth.Database.Auth")))) 
     .BuildSessionFactory() 
    ); 

我已經驗證了用於日我的課Ë數據庫具有與Azeroth.Database.Auth

開始如果我使用#1一切正常pefectly我可以查詢/添加/刪除/更新數據庫中的命名空間。

如果我使用#2我得到一個異常 - 無法執行查詢 - 在每個數據庫操作。

希望有人能提供一些線索,爲什麼自動映射行不工作,但映射行工作。

這是異常的輸出:

NHibernate.Exceptions.GenericADOException:在MySql.Data.MySqlClient.MySqlStream.ReadPacket() 在MySql.Data.MySqlClient.NativeDriver無法執行查詢 .GetResult(的Int32 & affectedRow,Int64的& insertedId) 在MySql.Data.MySqlClient.Driver.NextResult(的Int32 statementId,布爾力) 在MySql.Data.MySqlClient.MySqlDataReader.NextResult() 在MySql.Data.MySqlClient。 MySqlCommand.ExecuteReader(的CommandBehavior行爲) 在MySql.Data.MySqlClient.MySqlCommand.ExecuteDbDataReader(的CommandBehavior行爲) 在System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader() 在NHibernate.AdoNet.AbstractBatcher.ExecuteReader(IDbCommand的CMD) 在NHibernate的.Loader.Loader.GetResultSet(IDbCommand的ST,布爾autoDiscoverTypes,布爾可調用,RowSelection選擇,ISessionImplementor會話) 在NHibernate.Loader.Loader.DoQuery(ISessionImplementor會話,queryParameters queryParameters,布爾returnProxies) 在NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections (ISessionImplementor會話,queryParameters queryParameters,布爾returnProxies) 在NHibernate.Loader.Loader.DoList(ISessionImplementor會話,queryParameters queryParameters) ---內部異常堆棧跟蹤的端---

[SELECT this_.Id如Id0_0_,this_.Username如Username0_0_,this_.Sha_Pass_hash如Sha3_0_0_,this_.Email如Email0_0_,this_.Joindate如Joindate0_0_,this_.LaspIp如LaspIp0_0_ ,this_.FailedLogins如FailedLo7_0_0_,this_.Locked如Locked0_0_,this_.LastLogin如LastLogin0_0_,this_.Online如Online0_0_,this_.Expansion如Expansion0_0_,this_.Mutetime如Mutetime0_0_,this_.Mutereason如Mutereason0_0_,this_.Muteby如Muteby0_0_,THIS_ .Locale如Locale0_0_,this_.Os如Os0_0_,this_.Recruiter如Recruiter0_0_,this_.Salt如Salt0_0_ FROM Account THIS_ WHERE this_.Username =?P0]

這樣就可以與自動映射它的映射見該類到數據庫。

我想使用自動映射,因爲我在1臺服務器上使用3個不同的數據庫,這取決於數據的位置,所以我有不同的命名空間中的類,希望根據命名空間將3個不同的會話工廠作爲在第二個。

回答

1

因爲有一次您將FluentNhibernate映射添加到工廠,而另一次您嘗試將AutomapperMappings添加到工廠。

兩者都是完全不同的映射策略。我希望你把所有的班級,ClassMap<T>等映射流利的映射......

Automapper不會將您手動定義流利映射,它會嘗試根據您的實體和其他一些自動生成的映射設置和默認值。

結果的原因完全不同的東西可以...因此它可能是你的查詢不與一個或其他工作了......

因此,例如,你的實體是Account與功能NHibernate你將它映射到一個完全不同名稱的表格,例如MyAccounTable,Automapper應該如何知道,它會簡單地做映射,假設表名等於實體名稱... 相同的一切...

+0

所以只需更改:public class Account {to說公共類帳戶{*我的表被命名帳戶全部小寫*會解決問題嗎?併爲自動映射我是否正確假設我需要在實體類中使用某種形式的數據註釋? –

+0

還是有一些與流利的映射在ClassMap類中指定數據庫AND表的方式? –

+0

@JacquelineLoriault你不能在類映射中定義數據庫。 Automapper更適用於代碼優先映射。您可以添加規則並覆蓋automapper如何生成映射的行爲。閱讀/查找如何編寫約定的例子...例如這裏http://fluentnhibernate.wikia.com/wiki/Auto_mapping 除此之外,如果您的數據庫具有所有不同的模式,只需將您的流暢映射放入不同的程序集,並將每個程序集添加到特定數據庫的會話工廠。 – MichaC