Fluent NHibernate无法在使用自动映射的情况下执行查询
本文关键字:映射 情况下 查询 执行 NHibernate Fluent | 更新日期: 2023-09-27 18:35:45
在过去的几天里,我一直在墙上敲打我的头,为什么我会有这种奇怪的行为
我尝试了以下 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()
);
阿拉伯数字:
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: 无法执行查询 at MySql.Data.MySqlClient.MySqlStream.ReadPacket() at MySql.Data.MySqlClient.NativeDriver.GetResult(Int32& impactRow, Int64& insertedId) at MySql.Data.MySqlClient.Driver.NextResult(Int32 statementId, Boolean force) at MySql.Data.MySqlClient.MySqlDataReader.NextResult() at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior) at MySql.Data.MySqlClient.MySqlCommand.ExecuteDbDataReader(CommandBehavior behavior) at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader() at NHibernate.AdoNet.AbstractBatcher.ExecuteReader(IDbCommand cmd) at NHibernate.Loader.Loader.GetResultSet(IDbCommand st, Boolean autoDiscoverTypes, Boolean callable, RowSelection selection, ISessionImplementor session) at NHibernate.Loader.Loader.DoQuery(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies) at NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies) at NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters) ---内部异常堆栈跟踪结束---
[ 选择this_。ID 为 Id0_0_,this_。用户名为Username0_0_,this_。Sha_Pass_hash Sha3_0_0_,this_。电子邮件作为Email0_0_,this_。加入日期为 Joindate0_0_,this_。LaspIp 作为LaspIp0_0_,this_。FailedLogins as FailedLo7_0_0_, this_.锁定为Locked0_0_,this_。最后登录为LastLogin0_0_,this_。在线作为Online0_0_,this_。Expansion0_0_扩张,this_。静音时间为Mutetime0_0_,this_。静音作为Mutereason0_0_,this_。穆特比 饰 Muteby0_0_,this_。区域设置为Locale0_0_,this_。操作系统作为Os0_0_,this_。招聘人员作为Recruiter0_0_,this_。盐作为Salt0_0_从
Account
this_this_的地方。用户名 = ?p0 ]
所以我可以看到自动映射它将类映射到数据库。
我想使用自动映射,因为我在 1 台服务器上使用 3 个不同的数据库,具体取决于数据的位置,所以我在不同的命名空间中拥有类,希望根据命名空间拉取 3 个不同的会话工厂,如第二个。
因为一次您将FluentNhibernate映射添加到工厂,另一次尝试将自动映射器映射添加到工厂。
两者都是完全不同的映射策略。我希望对于流畅的映射,您可以使用ClassMap<T>
等映射所有类......
自动映射器不会使用手动定义的 Fluent 映射,它将尝试根据您的实体和一些其他设置和默认值自动生成映射。
结果可能会导致完全不同的事情......因此,可能是您的查询不再适用于其中一个......
例如,您的实体是Account
的,并且使用流利的nhibernate,您可以将其映射到具有完全不同名称的表,例如 MyAccounTable
,Automapper应该如何知道这一点,它将简单地进行映射,假设表名等于实体名称...其他一切都一样...