質問は本当にそれをすべて言います。デフォルトでは としてマップすることですが、 として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));
カスタムタイプは、を使用するのではなく、列挙型のインスタンスとして処理されるように強制します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);
このように、FluentNHibernateマッピングに規則を追加します。
Fluently.Configure(nHibConfig)
.Mappings(mappingConfiguration =>
{
mappingConfiguration.FluentMappings
.ConventionDiscovery.AddFromAssemblyOf<EnumConvention>();
})
./* other configuration */
ExampleEnum? ExampleProperty
null 許容列挙型 ( など)を忘れないでください。それらは個別にチェックする必要があります。これは、新しい 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 値でマップした方法です。
Map(x => x.Status).CustomType(typeof(Int32));
私のために働く!
自動マッピングで Fluent NHibernate を使用している場合 (および潜在的に IoC コンテナー):
上記のIUserTypeConvention
@ Julienの回答: 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 などの IoC で (PersistenceFacility とインストーラーを使用して) 簡単に利用できます。*
Kernel.Register(
Component.For<ISessionFactory>()
.UsingFactoryMethod(() => CreateSessionFactory()),
Component.For<ISession>()
.UsingFactoryMethod(k => k.Resolve<ISessionFactory>().OpenSession())
.LifestylePerWebRequest()
);
NHibernateを作成し、プロパティマップIUserType
で使用して指定できます。CustomTypeIs<T>()
DB テーブルで値を int / tinyint として保持する必要があります。列挙型をマッピングするには、マッピングを正しく指定する必要があります。以下のマッピングと列挙型のサンプルを参照してください。
マッピング クラス
public class TransactionMap : ClassMap トランザクション { public TransactionMap() { //その他のマッピング ..... //列挙型のマッピング Map(x => x.Status, "Status").CustomType(); Table("トランザクション"); } }
列挙型
public enum TransactionStatus { 待機中 = 1、 処理済み = 2、 ロールバック = 3、 ブロックされた = 4、 返金済み = 5、 処理済み = 6、 }