2011-05-12 3 views
0

Je souhaite obtenir de l'aide sur la résolution d'une exception de mappage qui ne fournit aucun détail. Euh, OK - il y a plein de détails mais pas une classe ou une propriété.Le mappage Fluent-NHibernate lance "Type d'identifiant incorrect: System.Guid"

Pour commencer, je viens de passer à NH3.1 et FNH 1.2. J'ai une classe que j'utilise pour construire une base de données SQLite pour NHibernate (3.1.0.4000). J'ai du mal à essayer d'isoler le mappage fluent-nhibernate (1.2.0.712) qui est le problème.

L'erreur est:

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? Qu'est-ce que Guid? Je n'ai pas de Guid comme identifiant dans mes mappings. J'ai un Guid dans une classe en tant que propriété - j'utilise le guid pour traiter des enregistrements pour traitement par un service; pas un identifiant.

j'obtiens l'erreur sur cette ligne où j'instancier une en mémoire SQLiteConfiguration utilisant couramment-NHibernate (1.2.0.712):

var sessionFactory = configuration.BuildSessionFactory(); 

Je me suis tourné sur la configuration de base log4net pour se connecter à un fichier, mais peut Ne trouve aucune erreur. Voici la queue de ce journal:

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'a fourni aucune idée, est-il une autre façon que je peux déboguer cette exception pour révéler peut-être la classe ou bien?

Merci

EDIT -je utiliser un IIdConvention pour la mise en place mes clés primaires et ahem mon pantalon sont en feu: J'utilise Elmah, qui a un GUID pour ErrorId. Je vais voir si je peux tester l'instance entrante dans ma convention pour l'ensemble UnsavedValue correct pour les entiers par rapport à un Guid pour Elmah. Je vais tester cela demain et poster la réponse.

Répondre

0

Je viens de retirer l'Elmah du mappage de test et ça se construit bien maintenant.

Engine.UnsavedValueFactory.GetUnsavedIdentifierValue renvoie l'erreur car 0 n'est pas une valeur par défaut valide pour un GUID.

J'avais une convention d'identification NHibernate Fluent qui précédemment réglait tous les IDs avec une valeur par défaut de 0, et cela a cassé avec le changement de 2. * à 3.1.0.4000.

Questions connexes