开发者

Sharp Architecture using GUIDs

开发者 https://www.devze.com 2023-01-31 17:32 出处:网络
I\'m using Sharp Architecture 1.6 VS2010 and investigating using GUIDs but I\'m encountering an error that I\'ve been unable to resolve.

I'm using Sharp Architecture 1.6 VS2010 and investigating using GUIDs but I'm encountering an error that I've been unable to resolve.

Person Entity

using System;
using NHibernate.Validator.Constraints;
using SharpArch.Core.DomainModel;

namespace SharpDemo.Core
{
   public class Person : EntityWithTypedId<Guid>
   {
       [NotNullNotEmpty(Message = "First name must be provided.")]
       public virtual string FirstName { get; set; }

       [NotNullNotEmpty(Message = "Last name must be provided.")]
       public virtual string LastName { get; set; }
   }
}

Fluent Mapping

using FluentNHibernate.Automapping;
using FluentNHibernate.Automapping.Alterations;
using SharpDemo.Core;

namespace SharpDemo.Data.NHibernateMaps
{
   public class PersonMap : IAutoMappingOverride<Person>
   {
       public void Override(AutoMapping<Person> mapping)
       {
           mapping.Schema("dbo");
           mapping.Table("People");

           mapping.Id(x => x.Id).GeneratedBy.GuidComb();
       }
   }
}

The solution successfully builds but encounters the below error when debugging (which I have been unable to resolve). Any assistance is appreciated.

Source Error

Line 83:         private void InitializeNHibernateSession()
Line 84:         {
Line 85:             NHibernateSession.Init(
Line 86:                 webSessionStorage,
Line 87:                 new string[] { Server.MapPath("~/bin/SharpDemo.Data.dll") },

Stack Trace

[FormatException: Guid should contain 32 digits with 4 dashes (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).]
   System.Guid..ctor(String g) +2486
   NHibernate.Type.GuidType.FromStringValue(String xml) +75
   NHibernate.Type.GuidType.StringToObject(String xml) +86
   NHibernate.Engine.UnsavedValueFactory.GetUnsavedIdentifierValue(String unsavedValue, IGetter identifierGetter, IType identifierType, ConstructorInfo constructor) +644

[MappingException: Could not parse identifier unsaved-value: 0]
   NHibernate.Engine.UnsavedValueFactory.GetUnsavedIdentifierValue(String unsavedValue, IGetter identifierGetter, IType identifierType, ConstructorInfo constructor) +872
   NHibernate.Tuple.PropertyFactory.BuildIdentifierProperty(PersistentClass mappedEntity, IIdentifierGenerator generator) +220
   NHibernate.Tuple.Entity.EntityMetamodel..ctor(PersistentClass persistentClass, ISessionFactoryImplementor sessionFactory) +696
   NHibernate.Persister.Entity.AbstractEntityPersister..ctor(PersistentClass persistentClass, ICacheConcurrencyStrategy cache, ISessionFactoryImplementor factory) +784
   NHibernate.Persister.Entity.SingleTableEntityPersister..ctor(PersistentClass persistentClass, ICacheConcurrencyStrategy cache, ISessionFactoryImplementor factory, IMapping mapping) +379
   NHibernate.Persister.PersisterFactory.CreateClassPersister(PersistentClass model, ICacheConcurrencyStrategy cache, ISessionFactoryImplementor factory, IMapping cfg) +182
   NHibernate.Impl.SessionFactoryImpl..ctor(Configuration cfg, IMapping mapping, Settings settings, EventListeners listeners) +2117
   NHibernate.Cfg.Configuration.BuildSessionFactory() +189
   FluentNHibernate.Cfg.FluentConfiguration.BuildSessionFactory() +76

[FluentConfigurationException: An invalid or incomplete configuration was used while creating a SessionFactory. Check PotentialReasons collection, and InnerException for more detail.

  * Database was not configured through Database method.
]
   FluentNHibernate.Cfg.FluentConfiguration.BuildSessionFactory() +120
   SharpArch.Data.NHibernate.NHibernateSession.CreateSessionFactoryFor(String[] mappingAssemblies, AutoPersistenceModel autoPersistenceModel, Configuration cfg, IPersistenceConfigurer persistenceConfigurer) in e:\WorkSpaces\Git\SharpArchitecture\Trunk\src\SharpArch\SharpArch.Data\NHibernate\NHibernateSession.cs:328
   SharpArch.Data.NHibernate.NHibernateSession.AddConfiguration(String factoryKey, String[] mappingAssemblies, AutoPersistenceModel autoPersistenceModel, Configuration cfg, String validatorCfgFile, IPersistenceConfigurer persistenceConfigurer) in e:\WorkSpaces\Git\SharpArchitecture\Trunk\src\SharpArch\SharpArch.Data\NHibernate\NHibernateSession.cs:138
   SharpArch.Data.NHibernate.NHibernateSession.AddConfiguration(String factoryKey, String[] mappingAssemblies, AutoPersistenceModel autoPersistenceModel, String cfgFile, IDictionary`2 cfgProperties, String validatorCfgFile, IPersistenceConfigurer persistenceConfigurer) in e:\WorkSpaces\Git\SharpArchitecture\Trunk\src\SharpArch\SharpArch.Data\NHibernate\NHibernateSession.cs:126
   SharpArch.Data.NHibernate.NHibernateSession.Init(ISessionStorage storage, String[] mappingAssemblies, AutoPersistenceModel autoPersistenceModel, String cfgFile, IDictionary`2 cfgProperties, Strin开发者_StackOverflowg validatorCfgFile, IPersistenceConfigurer persistenceConfigurer) in e:\WorkSpaces\Git\SharpArchitecture\Trunk\src\SharpArch\SharpArch.Data\NHibernate\NHibernateSession.cs:101
   SharpArch.Data.NHibernate.NHibernateSession.Init(ISessionStorage storage, String[] mappingAssemblies, AutoPersistenceModel autoPersistenceModel, String cfgFile) in e:\WorkSpaces\Git\SharpArchitecture\Trunk\src\SharpArch\SharpArch.Data\NHibernate\NHibernateSession.cs:51
   SharpDemo.Web.MvcApplication.InitializeNHibernateSession() in D:\Web\Mvc\Projects\Temp\SharpDemo\app\SharpDemo.Web\Global.asax.cs:85
   SharpDemo.Web.MvcApplication.<Application_BeginRequest>b__3() in D:\Web\Mvc\Projects\Temp\SharpDemo\app\SharpDemo.Web\Global.asax.cs:76
   SharpArch.Data.NHibernate.NHibernateInitializer.InitializeNHibernateOnce(Action initMethod) in e:\WorkSpaces\Git\SharpArchitecture\Trunk\src\SharpArch\SharpArch.Data\NHibernate\NHibernateInitializer.cs:46
   SharpDemo.Web.MvcApplication.Application_BeginRequest(Object sender, EventArgs e) in D:\Web\Mvc\Projects\Temp\SharpDemo\app\SharpDemo.Web\Global.asax.cs:75
   System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +68
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75


It looks like the unsaved value is being set to 0 by the automapping. Try changing your mapping override to:

mapping.Id(x => x.Id).GeneratedBy.GuidComb().Default(Guid.Empty);

mapping.Id(x => x.Id).GeneratedBy.GuidComb().UnsavedValue(Guid.Empty);
0

精彩评论

暂无评论...
验证码 换一张
取 消