我一直在打我的頭在牆上的最後幾天,爲什麼我得到這個奇怪的行爲功能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個不同的會話工廠作爲在第二個。
所以只需更改:public class Account {to說公共類帳戶{*我的表被命名帳戶全部小寫*會解決問題嗎?併爲自動映射我是否正確假設我需要在實體類中使用某種形式的數據註釋? –
還是有一些與流利的映射在ClassMap類中指定數據庫AND表的方式? –
@JacquelineLoriault你不能在類映射中定義數據庫。 Automapper更適用於代碼優先映射。您可以添加規則並覆蓋automapper如何生成映射的行爲。閱讀/查找如何編寫約定的例子...例如這裏http://fluentnhibernate.wikia.com/wiki/Auto_mapping 除此之外,如果您的數據庫具有所有不同的模式,只需將您的流暢映射放入不同的程序集,並將每個程序集添加到特定數據庫的會話工廠。 – MichaC