2010-12-23 117 views
1

我使用夏普体系结构1.6 VS2010并调查使用GUID 但我遇到了一个我一直无法解决的错误。使用GUID的夏普体系结构

Person实体

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; } 
    } 
} 

流利的映射

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(); 
     } 
    } 
} 

该解决方案成功生成,但遇到下面的错误,当 调试(我一直无法解析)。任何帮助是 赞赏。

源错误

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

堆栈跟踪

[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, String 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 

回答

1

它看起来像正在被自动映射设置为0未保存的价值。尝试将您的映射覆盖更改为:

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

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

感谢您的反馈。当我追加.Default(Guid.Empty)时遇到了同样的错误,但它引导我尝试.UnsavedValue(Guid.NewGuid()),这似乎解决了问题。谢谢詹姆斯。 – Tyler 2010-12-23 16:48:59