0

我想要一些有关如何解决不提供详细信息的映射异常的帮助。呃,好的——有很多细节,只是没有类或属性。

首先,我刚刚升级到 NH3.1 和 FNH 1.2。我有一个类用于为 NHibernate (3.1.0.4000) 构建 SQLite 数据库。我在尝试隔离问题所在的 fluent-nhibernate(1.2.0.712) 映射时遇到了麻烦。

错误是:

System.InvalidCastException: Unable to cast object of type 'NHibernate.Type.SerializableType' to type 'NHibernate.Type.IIdentifierType'. at NHibernate.Engine.UnsavedValueFactory.GetUnsavedIdentifierValue(String unsavedValue, IGetter identifierGetter, IType identifierType, ConstructorInfo constructor) NHibernate.MappingException: Bad identifier type: System.Guid at NHibernate.Engine.UnsavedValueFactory.GetUnsavedIdentifierValue(String unsavedValue, IGetter identifierGetter, IType identifierType, ConstructorInfo constructor) at NHibernate.Tuple.PropertyFactory.BuildIdentifierProperty(PersistentClass mappedEntity, IIdentifierGenerator generator) at NHibernate.Tuple.Entity.EntityMetamodel..ctor(PersistentClass persistentClass, ISessionFactoryImplementor sessionFactory) at NHibernate.Persister.Entity.AbstractEntityPersister..ctor(PersistentClass persistentClass, ICacheConcurrencyStrategy cache, ISessionFactoryImplementor factory) at NHibernate.Persister.Entity.SingleTableEntityPersister..ctor(PersistentClass persistentClass, ICacheConcurrencyStrategy cache, ISessionFactoryImplementor factory, IMapping mapping) at NHibernate.Persister.PersisterFactory.CreateClassPersister(PersistentClass model, ICacheConcurrencyStrategy cache, ISessionFactoryImplementor factory, IMapping cfg) at NHibernate.Impl.SessionFactoryImpl..ctor(Configuration cfg, IMapping mapping, Settings settings, EventListeners listeners) at NHibernate.Cfg.Configuration.BuildSessionFactory() at MYPROJ.DatabaseConfigurer.OpenSession(DbEnum database) in DatabaseConfigurer.cs: line 37 at MYPROJ.user_specification.<.ctor>b__5() in UserSpecs.cs: line 670

指导?什么指导?我的映射中的任何地方都没有 Guid 作为标识符。我在一个类中确实有一个 Guid 作为属性——我使用该 guid 批处理记录以供服务处理;不是标识符。

我在使用 fluent-nhibernate (1.2.0.712) 实例化内存中 SQLiteConfiguration 的这一行中收到错误:

var sessionFactory = configuration.BuildSessionFactory();

我打开 log4net 基本配置以记录到文件,但找不到任何错误。这是该日志的尾部:

2011-05-12 15:29:04,152 [1] ?.lambda_method(:0) - processing filters (second pass)
2011-05-12 15:29:04,199 [1] ?.lambda_method(:0) - Using dialect: NHibernate.Dialect.SQLiteDialect
2011-05-12 15:29:04,277 [1] ?.lambda_method(:0) - Using dialect defined converter
2011-05-12 15:29:04,277 [1] ?.lambda_method(:0) - Generate SQL with comments: disabled
2011-05-12 15:29:04,277 [1] ?.lambda_method(:0) - Initializing connection provider: NHibernate.Connection.DriverConnectionProvider
2011-05-12 15:29:04,277 [1] ?.lambda_method(:0) - Configuring ConnectionProvider
2011-05-12 15:29:04,277 [1] ?.lambda_method(:0) - Transaction factory: NHibernate.Transaction.AdoNetWithDistributedTransactionFactory
2011-05-12 15:29:04,293 [1] ?.lambda_method(:0) - Optimize cache for minimal puts: False
2011-05-12 15:29:04,293 [1] ?.lambda_method(:0) - Connection release mode: on_close
2011-05-12 15:29:04,293 [1] ?.lambda_method(:0) - Default batch fetch size: 1
2011-05-12 15:29:04,293 [1] ?.lambda_method(:0) - echoing all SQL to stdout
2011-05-12 15:29:04,293 [1] ?.lambda_method(:0) - Statistics: disabled
2011-05-12 15:29:04,293 [1] ?.lambda_method(:0) - Deleted entity synthetic identifier rollback: disabled
2011-05-12 15:29:04,293 [1] ?.lambda_method(:0) - Query translator: NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory
2011-05-12 15:29:04,293 [1] ?.lambda_method(:0) - Query language substitutions: {'true'='1', 'false'='0'}
2011-05-12 15:29:04,293 [1] ?.lambda_method(:0) - cache provider: NHibernate.Cache.NoCacheProvider, NHibernate, Version=3.1.0.4000, Culture=neutral, PublicKeyToken=aa95f207798dfdb4
2011-05-12 15:29:04,293 [1] ?.lambda_method(:0) - Wrap result sets: disabled
2011-05-12 15:29:04,293 [1] ?.lambda_method(:0) - Batcher factory: NHibernate.AdoNet.NonBatchingBatcherFactory, NHibernate, Version=3.1.0.4000, Culture=neutral, PublicKeyToken=aa95f207798dfdb4
2011-05-12 15:29:04,293 [1] ?.lambda_method(:0) - Default entity-mode: Poco
2011-05-12 15:29:04,293 [1] ?.lambda_method(:0) - Named query checking : enabled
2011-05-12 15:29:04,324 [1] ?.lambda_method(:0) - building session factory
2011-05-12 15:29:04,324 [1] ?.lambda_method(:0) - Session factory constructed with filter configurations : {}
2011-05-12 15:29:04,324 [1] ?.lambda_method(:0) - instantiating session factory with properties: {'connection.provider'='NHibernate.Connection.DriverConnectionProvider', 'proxyfactory.factory_class'='NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle', 'connection.driver_class'='NHibernate.Driver.SQLite20Driver, NHibernate, Version=3.1.0.4000, Culture=neutral, PublicKeyToken=aa95f207798dfdb4', 'dialect'='NHibernate.Dialect.SQLiteDialect, NHibernate, Version=3.1.0.4000, Culture=neutral, PublicKeyToken=aa95f207798dfdb4', 'hibernate.dialect'='NHibernate.Dialect.SQLiteDialect, NHibernate, Version=3.1.0.4000, Culture=neutral, PublicKeyToken=aa95f207798dfdb4', 'query.substitutions'='true=1;false=0', 'connection.release_mode'='on_close', 'show_sql'='true', 'connection.connection_string'='Data Source=:memory:;Version=3;New=True;'}
2011-05-12 15:29:04,324 [1] ?.lambda_method(:0) - Obtaining IDbConnection from Driver
2011-05-12 15:29:04,324 [1] ?.lambda_method(:0) - Closing connection

Log4net 没有提供任何见解,是否有另一种方法可以调试此异常以显示类或属性?

谢谢

编辑我使用IIdConvention 来设置我的主键,我的裤子着火了:我使用 Elmah,它有一个用于 ErrorId 的 GUID。我将看看我是否可以在我的约定中测试传入的实例,以获得整数的正确 UnsavedValue 集和 Elmah 的 Guid。我明天将对此进行测试并发布答案。

4

1 回答 1

0

我刚刚从测试映射中删除了 Elmah,它现在构建得很好。

Engine.UnsavedValueFactory.GetUnsavedIdentifierValue 引发错误,因为 0 不是 GUID 的有效默认值。

我有一个 Fluent NHibernate ID 约定,之前将所有ID 设置为默认值 0,而这与从 2.* 到 3.1.0.4000 的更改一起破坏了。

于 2011-05-13T15:12:45.087 回答