【问题标题】:Mapping DayOfWeek from the System namespace using Fluent Nhibernate使用 Fluent Nhibernate 从 System 命名空间映射 DayOfWeek
【发布时间】:2012-03-30 00:13:30
【问题描述】:

我目前正在开发一个使用 Fluent NHibernate 的 MVC 3 项目。我使用 System.DayOfWeek 枚举,但是在映射它时我收到以下错误 -

Stack Trace: 

[MappingException: Could not determine type for: DayOfWeek, for columns:      NHibernate.Mapping.Column(WeekStart)]
NHibernate.Mapping.SimpleValue.get_Type() +456
NHibernate.Mapping.SimpleValue.IsValid(IMapping mapping) +40
NHibernate.Mapping.PersistentClass.Validate(IMapping mapping) +123
NHibernate.Mapping.RootClass.Validate(IMapping mapping) +24
NHibernate.Cfg.Configuration.ValidateEntities() +280
NHibernate.Cfg.Configuration.BuildSessionFactory() +43
FluentNHibernate.Cfg.FluentConfiguration.BuildSessionFactory() +54

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

Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET     
Version:4.0.30319.272 

示例用法 -

Map(x => x.WeekStart).CustomType(typeof(DayOfWeek));

我已经在邮件列表和 stackoverflow 上看到过这个特定问题,但它的细微差别似乎从未被完全掌握,提出问题的人被称为如何使用自定义类型映射。

我很清楚如何在流畅的地图上使用 customtype 功能并经常使用它。但是我不明白为什么这个枚举特别不能被映射。我认为它与它所属的 System 命名空间有关?

如果有人能对此有所了解,我会非常高兴。

谢谢

【问题讨论】:

  • 你找到答案了吗?您可以为枚举指定自定义类型的 int,但强制转换会使属性变脏,从而导致不必要的更新。

标签: c#-4.0 fluent-nhibernate enums


【解决方案1】:

与使用 NHibernate 的任何枚举映射一样,避免一些麻烦(导致不必要写入的脏读、数据库中指定的不同类型等)并始终使用 PersistentEnumType。

在本例中,创建您的 PersistentEnumType:

public class NHibernateDayOfWeekEnumMapper : global::NHibernate.Type.PersistentEnumType
{
    public NHibernateDayOfWeekEnumMapper()
        : base(typeof(DayOfWeek))
    {

    }
}

然后用它来做你的映射:

Map(x => x.DayOfWeek).CustomType<NHibernateDayOfWeekEnumMapper>().Not.Nullable();

现在您已经获得了不会脏读(因此没有不必要的写入)的实体和数据库中正确的类型映射(当您使用 SchemaExport 生成架构时)。

欲了解更多信息,请参阅http://eashi.wordpress.com/2008/08/19/mapping-enumeration-of-type-int-in-nhibernate/ 上的老歌

【讨论】:

    【解决方案2】:

    我得到了 DayOfWeek 枚举的映射来处理这个映射。

    mapping.Map(x => x.DayOfWeek);
    

    它可以很好地映射到我的 mssql 数据库中的 nvarchar(255)。

    我的属性看起来像这样

    public virtual DayOfWeek DayOfWeek { get; set; }
    

    我使用 NHibernate 版本:3.3.1.4000 和 Fluent Nhibernate 版本:1.3.0.733

    【讨论】:

      猜你喜欢
      • 2011-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-18
      • 2010-12-09
      • 2012-04-03
      • 2014-12-09
      • 1970-01-01
      相关资源
      最近更新 更多