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 个不同的会话工厂,如第二个。

Fluent NHibernate无法在使用自动映射的情况下执行查询

因为一次您将FluentNhibernate映射添加到工厂,另一次尝试将自动映射器映射添加到工厂。

两者都是完全不同的映射策略。我希望对于流畅的映射,您可以使用ClassMap<T>等映射所有类......

自动映射器不会使用手动定义的 Fluent 映射,它将尝试根据您的实体和一些其他设置和默认值自动生成映射。

结果可能会导致完全不同的事情......因此,可能是您的查询不再适用于其中一个......

例如,您的实体是Account的,并且使用流利的nhibernate,您可以将其映射到具有完全不同名称的表,例如 MyAccounTable,Automapper应该如何知道这一点,它将简单地进行映射,假设表名等于实体名称...其他一切都一样...