0

在过去的几天里,我一直在敲墙,为什么我会出现这种奇怪的行为

我尝试了以下两种设置

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.NativeDriver.GetResult 的 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 selection,ISessionImplementor session) 在 NHibernate.Loader.Loader.DoQuery(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies) 在 NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies) 在 NHibernate.Loader.Loader.DoList(ISessionImplementor session , 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_。 Recruiter 作为 Recruiter0_0_, this_.Salt 作为 Salt0_0_ FROM Accountthis_ WHERE this_.Username = ?p0 ]

所以我可以看到自动映射它的类到数据库。

我想使用自动映射,因为我在一台服务器上使用 3 个不同的数据库,具体取决于数据的位置,所以我有不同命名空间中的类,希望根据命名空间拉 3 个不同的会话工厂,就像第二个一样.

4

1 回答 1

1

因为一次您将 FluentNhibernate Mappings 添加到工厂,而另一次您尝试将 AutomapperMappings 添加到工厂。

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

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

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

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

于 2013-10-17T17:10:02.033 回答