O mapeamento Fluent-NHibernate gera “Tipo de identificador incorreto:Sistema.Guid”
-
12-11-2019 - |
Pergunta
Gostaria de obter ajuda sobre como solucionar problemas de uma exceção de mapeamento que não fornece detalhes.Er, OK - há muitos detalhes, mas não uma classe ou propriedade.
Para começar, acabei de atualizar para NH3.1 e FNH 1.2.Eu tenho uma classe que uso para construir um banco de dados SQLite para NHibernate (3.1.0.4000).Estou tendo problemas para tentar isolar o mapeamento fluent-nhibernate(1.2.0.712) que é o problema.
O erro é:
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
Guia?Qual guia?Não tenho um Guid como identificador em nenhum lugar dos meus mapeamentos.Eu tenho um Guid em uma classe como propriedade - eu uso o guid para agrupar registros para processamento por um serviço;não é um identificador.
Recebo o erro nesta linha onde instanciarei um SQLiteConfiguration na memória usando fluent-nhibernate (1.2.0.712):
var sessionFactory = configuration.BuildSessionFactory();
Ativei a configuração básica do log4net para registrar em um arquivo, mas não consigo encontrar nenhum erro.Aqui está o final desse log:
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 não forneceu nenhum insight. Existe outra maneira de depurar essa exceção para revelar talvez a classe ou propriedade?
Obrigado
EDITAREu uso um IIdConvention para configurar minhas chaves primárias e aham minhas calças estão em chamas:Eu uso o Elmah, que possui um GUID para ErrorId.Verei se consigo testar a instância de entrada em minha convenção para o conjunto UnsavedValue adequado para números inteiros versus um Guid para Elmah.Vou testar isso amanhã e posto a resposta.
Solução
Acabei de remover o Elmah do mapeamento de teste e ele funciona bem agora.
Engine.UnsavedValueFactory.GetUnsavedIdentifierValue está gerando o erro porque 0 não é um valor padrão válido para um GUID.
Eu tinha uma convenção do Fluent NHibernate ID que estava definindo anteriormente todos IDs com valor padrão 0, e isso quebrou com a mudança de 2.* para 3.1.0.4000.