Отображение DayOfWeek из пространства имен System с использованием Fluent Nhibernate - PullRequest
8 голосов
/ 13 марта 2012

В настоящее время я работаю над проектом MVC 3, в котором используется Fluent NHibernate.Я использую перечисление 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, но нюансы этого никогда не казались полностью понятными, и человек, задающий вопрос, обращается к тому, как использовать пользовательское отображение типов.

Я хорошо знаю, как использовать функциональность нестандартного типа на беглых картах и ​​часто использую его.Однако я не понимаю, почему это перечисление в частности не может быть отображено.Я предполагаю, что это как-то связано с пространством имен System, к которому оно принадлежит?

Если кто-нибудь сможет пролить свет на это, я был бы очень счастлив.

Спасибо

Ответы [ 2 ]

1 голос
/ 26 октября 2013

Как и в случае любого сопоставления перечисления с 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/

1 голос
/ 24 января 2013

Я получил отображение перечисления DayOfWeek для работы с этим отображением.

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

и его карты в порядке в nvarchar (255) в моей базе данных mssql.

Моя собственность выглядит так

public virtual DayOfWeek DayOfWeek { get; set; }

Я использую версию NHibernate: 3.3.1.4000 и версию Fluent Nhibernate: 1.3.0.733

...