Pertanyaan mengatakan itu semua benar-benar, defaultnya adalah untuk memetakan sebagai string
tapi saya membutuhkannya untuk memetakan sebagai int
.
Saat ini saya menggunakan PersistenceModel
untuk mengatur konvensi saya jika itu membuat perbedaan. Terima kasih sebelumnya.
Pembaruan Menemukan bahwa mendapatkan ke versi terbaru kode dari bagasi menyelesaikan kesengsaraan saya.
nhibernate
fluent-nhibernate
Garry Shutler
sumber
sumber
Jawaban:
Cara untuk mendefinisikan konvensi ini kadang-kadang berubah, sekarang:
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); } }
sumber
Jadi, seperti yang disebutkan, mengeluarkan versi terbaru dari Fluent NHibernate dari bagasi membawa saya ke tempat yang saya inginkan. Contoh pemetaan enum dengan kode terbaru adalah:
Map(quote => quote.Status).CustomTypeIs(typeof(QuoteStatus));
Jenis kustom memaksanya untuk ditangani sebagai instance enum daripada menggunakan
GenericEnumMapper<TEnum>
.Saya benar-benar mempertimbangkan untuk mengirimkan tambalan untuk dapat mengubah antara pemeta enum yang mempertahankan string dan yang mempertahankan int karena itu tampak seperti sesuatu yang harus Anda atur sebagai konvensi.
Ini muncul di aktivitas saya baru-baru ini dan banyak hal telah berubah di Fluent NHibernate versi terbaru untuk membuatnya lebih mudah.
Untuk membuat semua enum dipetakan sebagai integer, Anda sekarang dapat membuat konvensi seperti ini:
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; } }
Maka pemetaan Anda hanya harus:
Map(quote => quote.Status);
Anda menambahkan konvensi ke pemetaan Fluent NHibernate seperti ini;
Fluently.Configure(nHibConfig) .Mappings(mappingConfiguration => { mappingConfiguration.FluentMappings .ConventionDiscovery.AddFromAssemblyOf<EnumConvention>(); }) ./* other configuration */
sumber
Jangan lupa tentang enum nullable (like
ExampleEnum? ExampleProperty
)! Mereka perlu diperiksa secara terpisah. Beginilah cara melakukannya dengan konfigurasi gaya FNH baru: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); } }
sumber
int
? Dan kapan tipe accept Flags? Seperti:MyEnum.Active | MyEnum.Paused
beginilah cara saya memetakan properti enum dengan nilai int:
Map(x => x.Status).CustomType(typeof(Int32));
bekerja untuk saya!
sumber
Bagi mereka yang menggunakan Fluent NHibernate dengan Automapping (dan berpotensi wadah IoC):
Seperti jawaban
IUserTypeConvention
@ Julien di atas: 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); } }
Konfigurasi Fluent NHibernate Automapping dapat dikonfigurasi seperti ini:
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>(); }); }
* Kemudian
CreateSessionFactory
dapat digunakan dalam IoC seperti Castle Windsor (menggunakan PersistenceFacility dan installer) dengan mudah. *Kernel.Register( Component.For<ISessionFactory>() .UsingFactoryMethod(() => CreateSessionFactory()), Component.For<ISession>() .UsingFactoryMethod(k => k.Resolve<ISessionFactory>().OpenSession()) .LifestylePerWebRequest() );
sumber
Anda dapat membuat NHibernate
IUserType
, dan menentukannya menggunakanCustomTypeIs<T>()
di peta properti.sumber
Anda harus menyimpan nilai sebagai int / tinyint di Tabel DB Anda. Untuk memetakan enum Anda, Anda perlu menentukan pemetaan dengan benar. Silakan lihat di bawah pemetaan dan sampel enum,
Kelas Pemetaan
Enum
sumber