【问题标题】:Sharp Architecture using GUIDs使用 GUID 的夏普架构
【发布时间】:2010-12-23 00:11:55
【问题描述】:

我正在使用 Sharp Architecture 1.6 VS2010 并使用 GUID 进行调查 但我遇到了一个我无法解决的错误。

人物实体

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 映射

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

【问题讨论】:

    标签: nhibernate fluent-nhibernate s#arp-architecture


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的反馈。我在附加 .Default(Guid.Empty) 时遇到了同样的错误,但它让我尝试 .UnsavedValue(Guid.NewGuid()) 似乎已经解决了这个问题。谢谢詹姆斯。
    • 糟糕,我的错。感谢您了解并更新。我为其他人找到了这个问题的答案。老实说,Fluent NHibernate 应该默认为 guid PK 使用未保存的 Guid.Empty 值。 NHibernate 可以。不幸的是,Fluent NH 在生成映射时显式覆盖了未保存的值。
    猜你喜欢
    • 2012-01-23
    • 2011-10-28
    • 2012-09-23
    • 1970-01-01
    • 2012-06-02
    • 2011-06-24
    • 1970-01-01
    • 2019-06-22
    • 2017-02-26
    相关资源
    最近更新 更多