질문은 실제로 모든 것을 말합니다. 기본값은으로 매핑하는 string
것이지만 int
.
나는 현재 PersistenceModel
그것이 차이가 있다면 내 규칙을 설정하는 데 사용하고 있습니다. 미리 감사드립니다.
업데이트 트렁크에서 최신 버전의 코드를 가져 오는 것이 내 문제를 해결했다는 사실을 발견했습니다.
질문은 실제로 모든 것을 말합니다. 기본값은으로 매핑하는 string
것이지만 int
.
나는 현재 PersistenceModel
그것이 차이가 있다면 내 규칙을 설정하는 데 사용하고 있습니다. 미리 감사드립니다.
업데이트 트렁크에서 최신 버전의 코드를 가져 오는 것이 내 문제를 해결했다는 사실을 발견했습니다.
답변:
이 규칙을 정의하는 방법은 때때로 변경되었습니다. 지금은 다음과 같습니다.
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));
사용자 지정 형식은 .NET Framework를 사용하는 대신 열거 형의 인스턴스로 처리되도록합니다 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 */
nullable 열거 형 (예 :)을 잊지 마세요 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
? 그리고 유형이 플래그를 허용 할 때? 좋아요 :MyEnum.Active | MyEnum.Paused
이것은 int 값으로 enum 속성을 매핑 한 방법입니다.
Map(x => x.Status).CustomType(typeof(Int32));
나를 위해 작동합니다!
Automapping (및 잠재적으로 IoC 컨테이너)과 함께 Fluent NHibernate를 사용하는 경우 :
는 IUserTypeConvention
@ 같다 줄리앙 의 대답 위 : https://stackoverflow.com/a/1706462/878612
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 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
Castle Windsor (PersistenceFacility 및 설치 프로그램 사용)와 같은 IoC에서 쉽게 사용할 수 있습니다. *
Kernel.Register(
Component.For<ISessionFactory>()
.UsingFactoryMethod(() => CreateSessionFactory()),
Component.For<ISession>()
.UsingFactoryMethod(k => k.Resolve<ISessionFactory>().OpenSession())
.LifestylePerWebRequest()
);
DB 테이블에서 값을 int / tinyint로 유지해야합니다. 열거 형을 매핑하려면 매핑을 올바르게 지정해야합니다. 아래 매핑 및 열거 형 샘플을 참조하십시오.
매핑 클래스
공용 클래스 TransactionMap : ClassMap 트랜잭션 { 공용 TransactionMap () { // 기타 매핑 ..... // 열거 형 매핑 Map (x => x.Status, "상태") .CustomType (); Table ( "거래"); } }
열거 형
공개 열거 형 TransactionStatus { 대기 = 1, 처리됨 = 2, 롤백 = 3, 차단됨 = 4, 환불 됨 = 5, 이미 처리됨 = 6, }