0

ここ数日、なぜこのような奇妙な振る舞いをするのか頭を悩ませていました

次の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を使用すると、すべてが完璧に機能し、データベースを照会/追加/削除/更新できます。

#2を使用すると、すべてのデータベース操作で例外が発生します-クエリを実行できません-。

自動マッピング行が機能しないのにマッピング行が機能する理由について、誰かが光を当てることができることを願っています。

これは例外の出力です。

NHibernate.Exceptions.GenericADOException: MySql.Data.MySqlClient.MySqlStream.ReadPacket() でクエリを実行できませんでしたInt32 statementId、Boolean force) で 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、Boolean autoDiscoverTypes、Boolean callable、RowSelection 選択、NHibernate.Loader.Loader.DoQuery(ISessionImplementor セッション、QueryParameters queryParameters、Boolean returnProxies) の NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor セッション、QueryParameters queryParameters、ブール値の returnProxies) , QueryParameters queryParameters) --- 内部例外スタック トレースの終了 ---QueryParameters queryParameters) --- 内部例外スタック トレースの終了 ---QueryParameters queryParameters) --- 内部例外スタック トレースの終了 ---

[ 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_.リクルーターとして Recruiter0_0_, this_.Salt as Salt0_0_ FROM Accountthis_ WHERE this_.Username = ?p0 ]

したがって、クラスをデータベースにマッピングする自動マッピングで確認できます。

データの場所に応じて1つのサーバーで3つの異なるデータベースを使用しているため、自動マッピングを使用したいので、2番目のように名前空間に基づいて3つの異なるセッションファクトリをプルすることを望んでいる異なる名前空間にクラスがあります.

4

1 に答える 1

1

あるときは FluentNhibernate Mappings をファクトリに追加し、別のときは AutomapperMappings をファクトリに追加しようとするためです。

どちらも完全に異なるマッピング戦略です。流暢なマッピングでは、すべてのクラスがマップされていることを期待していますClassMap<T>...

Automapper は、手動で定義した Fluent Mappings を使用せず、エンティティやその他の設定とデフォルトに基づいてマッピングを自動的に生成しようとします。

結果はまったく異なるものになる可能性があります...したがって、クエリがいずれかで機能しなくなる可能性があります...

したがって、たとえば、エンティティはAccount流暢なnhibernateを使用して、完全に異なる名前のテーブルにマップしました。たとえばMyAccounTable、Automapperはそれをどのように認識すべきか、テーブル名がエンティティ名と等しいと仮定してマッピングを行うだけです...他のすべてについても同じです...

于 2013-10-17T17:10:02.033 に答える