Pytanie mówi wszystko, tak naprawdę, domyślnie jest to mapowane jako, string
ale potrzebuję, aby mapować jako int
.
Obecnie używam PersistenceModel
do ustawiania moich konwencji, jeśli to ma znaczenie. Z góry dziękuję.
Aktualizacja Stwierdziliśmy, że uzyskanie najnowszej wersji kodu z bagażnika rozwiązało moje problemy.
nhibernate
fluent-nhibernate
Garry Shutler
źródło
źródło
Odpowiedzi:
Sposób definiowania tej konwencji zmieniał się czasami temu, teraz jest:
public class EnumConvention : IUserTypeConvention { public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria) { criteria.Expect(x => x.Property.PropertyType.IsEnum); } public void Apply(IPropertyInstance target) { target.CustomType(target.Property.PropertyType); } }
źródło
Tak więc, jak wspomniano, pobranie najnowszej wersji Fluent NHibernate z bagażnika doprowadziło mnie do miejsca, w którym musiałem być. Przykładowe mapowanie wyliczenia z najnowszym kodem to:
Map(quote => quote.Status).CustomTypeIs(typeof(QuoteStatus));
Typ niestandardowy wymusza obsługę jako wystąpienie wyliczenia, a nie używanie
GenericEnumMapper<TEnum>
.Właściwie rozważam przesłanie poprawki, aby móc zmieniać między maperem wyliczenia, który utrzymuje ciąg znaków, a takim, który utrzymuje int, ponieważ wydaje się, że jest to coś, co powinno być w stanie ustawić jako konwencję.
Pojawiło się to podczas mojej ostatniej aktywności i wiele się zmieniło w nowszych wersjach Fluent NHibernate, aby to ułatwić.
Aby zmapować wszystkie wyliczenia jako liczby całkowite, możesz teraz utworzyć taką konwencję:
public class EnumConvention : IUserTypeConvention { public bool Accept(IProperty target) { return target.PropertyType.IsEnum; } public void Apply(IProperty target) { target.CustomTypeIs(target.PropertyType); } public bool Accept(Type type) { return type.IsEnum; } }
Wtedy twoje mapowanie musi być tylko:
Map(quote => quote.Status);
Dodajesz konwencję do mapowania Fluent NHibernate w ten sposób;
Fluently.Configure(nHibConfig) .Mappings(mappingConfiguration => { mappingConfiguration.FluentMappings .ConventionDiscovery.AddFromAssemblyOf<EnumConvention>(); }) ./* other configuration */
źródło
Nie zapomnij o wyliczeniach dopuszczających wartość zerową (jak
ExampleEnum? ExampleProperty
)! Należy je sprawdzić osobno. Oto, jak to się robi z nową konfiguracją stylu FNH:public class EnumConvention : IUserTypeConvention { public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria) { criteria.Expect(x => x.Property.PropertyType.IsEnum || (x.Property.PropertyType.IsGenericType && x.Property.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>) && x.Property.PropertyType.GetGenericArguments()[0].IsEnum) ); } public void Apply(IPropertyInstance target) { target.CustomType(target.Property.PropertyType); } }
źródło
int
? A kiedy typ akceptuje Flagi? Na przykład:MyEnum.Active | MyEnum.Paused
w ten sposób zamapowałem właściwość enum na wartość int:
Map(x => x.Status).CustomType(typeof(Int32));
pracuje dla mnie!
źródło
Dla osób używających Fluent NHibernate z Automappingiem (i potencjalnie kontenera IoC):
IUserTypeConvention
Jest @ Julien „s odpowiedź powyżej: https://stackoverflow.com/a/1706462/878612public class EnumConvention : IUserTypeConvention { public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria) { criteria.Expect(x => x.Property.PropertyType.IsEnum); } public void Apply(IPropertyInstance target) { target.CustomType(target.Property.PropertyType); } }
Konfigurację Fluent NHibernate Automapping można skonfigurować w następujący sposób:
protected virtual ISessionFactory CreateSessionFactory() { return Fluently.Configure() .Database(SetupDatabase) .Mappings(mappingConfiguration => { mappingConfiguration.AutoMappings .Add(CreateAutomappings); } ).BuildSessionFactory(); } protected virtual IPersistenceConfigurer SetupDatabase() { return MsSqlConfiguration.MsSql2008.UseOuterJoin() .ConnectionString(x => x.FromConnectionStringWithKey("AppDatabase")) // In Web.config .ShowSql(); } protected static AutoPersistenceModel CreateAutomappings() { return AutoMap.AssemblyOf<ClassInAnAssemblyToBeMapped>( new EntityAutomapConfiguration()) .Conventions.Setup(c => { // Other IUserTypeConvention classes here c.Add<EnumConvention>(); }); }
* Następnie
CreateSessionFactory
można go łatwo wykorzystać w IoC, takim jak Castle Windsor (przy użyciu PersistenceFacility i instalatora). *Kernel.Register( Component.For<ISessionFactory>() .UsingFactoryMethod(() => CreateSessionFactory()), Component.For<ISession>() .UsingFactoryMethod(k => k.Resolve<ISessionFactory>().OpenSession()) .LifestylePerWebRequest() );
źródło
Możesz utworzyć NHibernate
IUserType
i określić goCustomTypeIs<T>()
na mapie właściwości.źródło
Powinieneś zachować wartości jako int / tinyint w swojej tabeli DB. Aby zmapować wyliczenie, musisz poprawnie określić mapowanie. Zobacz poniżej mapowanie i przykład wyliczenia,
Klasa mapowania
Enum
źródło