2012-03-13 5 views
8

Obecnie pracuję nad projektem MVC 3, który wykorzystuje Fluent NHibernate. I wykorzystać enum System.DayOfWeek ale gdy mapowanie to otrzymałem następujący błąd -Mapowanie DayOfWeek z obszaru nazw System przy użyciu Fluent Nhibernate

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 

Przykład użycia -

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

Widziałem ten specyficzny pytanie zadane na listach dyskusyjnych i na stackoverflow ale niuanse nigdy nie były w pełni zrozumiałe, a osoba zadająca pytanie została poproszona o zastosowanie mapowania typu niestandardowego.

Doskonale zdaję sobie sprawę z tego, jak korzystać z funkcji niestandardowych na płynnych mapach i często z nich korzystam. Jednak nie rozumiem, dlaczego tego wyliczenia w szczególności nie można zmapować. Zakładam, że ma coś wspólnego z przestrzenią nazw System, do której należy?

Jeśli ktokolwiek może rzucić jakiekolwiek światło na ten temat, byłbym szczęśliwy.

Dzięki

+0

Czy kiedykolwiek znaleźć odpowiedź na to pytanie? Możesz określić niestandardowy typ int dla wyliczenia, chociaż rzutowanie powoduje, że właściwość jest brudna, co może powodować niepotrzebne aktualizacje. –

Odpowiedz

1

mam mapowanie DAYOFWEEK wyliczenia do pracy z tego odwzorowania.

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

i jego mapy dobrze do nvarchar (255) w mojej bazie danych mssql.

Moi looklikes Ten

public virtual DayOfWeek DayOfWeek { get; set; } 

używam wersji NHibernate: wersja 3.3.1.4000 i Fluent NHibernate: 1.3.0.733

1

Jak w przypadku każdego mapowania enum z NHibernate, oszczędzić sobie trochę żalu (brudny czyta które powodują niepotrzebne zapisy, inny typ określony w bazie danych itp.) i zawsze używaj PersistentEnumType.

W tym przykładzie tworzenia PersistentEnumType:

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

    } 
} 

następnie użyć go, aby wykonać mapowanie:

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

Teraz masz podmiot, który nie brudzi read (a więc bez niepotrzebnych zapisów) i poprawne odwzorowanie typów w bazie danych (podczas korzystania z SchemaExport do generowania schematu).

Więcej informacji można znaleźć Stare, ale Goody w http://eashi.wordpress.com/2008/08/19/mapping-enumeration-of-type-int-in-nhibernate/