Вопрос говорит об этом на самом деле, по умолчанию он отображается как файл, string
но мне нужно, чтобы он отображался как int
.
В настоящее время я использую PersistenceModel
для установки своих соглашений, если это имеет значение. Заранее спасибо.
Обновление. Обнаружил, что установка последней версии кода из магистрали решила мои проблемы.
nhibernate
fluent-nhibernate
Гарри Шатлер
источник
источник
Ответы:
Способ определения этого соглашения иногда менялся назад, теперь он:
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); } }
источник
Итак, как уже упоминалось, получение последней версии Fluent NHibernate из магистрали привело меня туда, где я должен был быть. Пример сопоставления перечисления с последним кодом:
Map(quote => quote.Status).CustomTypeIs(typeof(QuoteStatus));
Пользовательский тип заставляет его обрабатывать как экземпляр перечисления, а не использовать
GenericEnumMapper<TEnum>
.На самом деле я рассматриваю возможность отправки патча, чтобы иметь возможность переключаться между сопоставителем перечислений, который сохраняет строку, и тем, который сохраняет int, поскольку это похоже на то, что вы должны иметь возможность установить в качестве соглашения.
Это всплыло во время моей недавней деятельности, и в новых версиях Fluent NHibernate все изменилось, чтобы упростить задачу.
Чтобы все перечисления отображались как целые числа, вы можете создать такое соглашение:
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; } }
Тогда ваше отображение должно быть:
Map(quote => quote.Status);
Вы добавляете соглашение к отображению Fluent NHibernate следующим образом:
Fluently.Configure(nHibConfig) .Mappings(mappingConfiguration => { mappingConfiguration.FluentMappings .ConventionDiscovery.AddFromAssemblyOf<EnumConvention>(); }) ./* other configuration */
источник
Не забывайте о перечислениях, допускающих значение NULL (например
ExampleEnum? ExampleProperty
)! Их нужно проверять отдельно. Вот как это делается с новой конфигурацией стиля 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); } }
источник
int
? А когда типа accept Flags? Нравится:MyEnum.Active | MyEnum.Paused
вот как я сопоставил свойство enum со значением int:
Map(x => x.Status).CustomType(typeof(Int32));
работает для меня!
источник
Для тех, кто использует Fluent NHibernate с Automapping (и, возможно, контейнер IoC):
Это
IUserTypeConvention
как ответ @ Julien выше: 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); } }
Конфигурацию Fluent NHibernate Automapping можно настроить следующим образом:
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>(); }); }
* Затем его
CreateSessionFactory
можно легко использовать в IoC, таком как Castle Windsor (с использованием PersistenceFacility и установщика). *Kernel.Register( Component.For<ISessionFactory>() .UsingFactoryMethod(() => CreateSessionFactory()), Component.For<ISession>() .UsingFactoryMethod(k => k.Resolve<ISessionFactory>().OpenSession()) .LifestylePerWebRequest() );
источник
Вы можете создать NHibernate
IUserType
и указать егоCustomTypeIs<T>()
на карте свойств.источник
Вы должны сохранить значения как int / tinyint в своей таблице БД. Для сопоставления вашего перечисления вам необходимо правильно указать сопоставление. См. Ниже образец сопоставления и перечисления,
Класс отображения
Enum
источник