2010-12-23 112 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