2010-11-19 14 views
0

Cinsiyetleri 'M' veya 'F' olarak kaydeden 'LS_GENDER' alanı olan bir veritabanım var.FluentNHibernate: Özellik için farklı türde veri türü olan alana nasıl erişilir?

Uygulamam, cinsiyetlerle çalışmak için Cinsiyet adı verilen bir numaralandırma kullanmaktadır.

private string _gender; 

public Gender Gender { get { return GetGenderFromString(_gender); } }; 

private Gender GetGenderFromString(string strGender) 
{ 
    switch (strGender.ToLower()) 
    { 
    case "f": 
     return Gender.Female; 
    case "m": 
     return Gender.Male; 
    default: 
     return Gender.Unknown; 
    } 
} 

nasıl FluentNHibernate ile bu harita yok:

Benim varlık aşağıdaki alanı ve özelliği vardır?

Map(x => x.Gender).Column("LS_GENDER").Access.CamelCaseField(Prefix.Underscore); 

ama hatası 'Cinsiyet olarak F ayrıştırılamıyor' alıyorum: (aşağıda gösterildiği gibi) ben saha erişimini kullanmaya çalışıyorum. Bence NHibernate kafasını karıştırıyor çünkü mülk ve alan aynı tipte değil.

Bunu nasıl eşleştirmeliyim?

cevap

0

Sen reveal kullanarak özel alan map:

Map(Reveal.Member<ClassType>("_gender")).Column("LS_GENDER"); 

Ama şimdi NHibernate Cinsiyet özellik hakkında bilmediği için bu LINQ sorunu çözmez. Her iki sorunu çözmek için IUserType uygulayan özel bir kullanıcı tipi kullanırdım.

+0

Bunu IUsertype kullanarak çözdüm. Aim Kai ayrıca IUserType hakkında konuştu, ancak daha az doğrudan. – David

0

Sanırım bir veritabanı dizesi değerini (M, F, U) bir numaralandırma ile eşleştiriyorsunuz.

Bu sorunun cevabı, numaralandırmaların dize değerleriyle eşleştirmenize yardımcı olabilir.

How do you map an enum as an int value with fluent NHibernate? Mapping custom enum classes with Fluent Nhibernate

Sen var numaralandırma için dizeleri (M, K, U) eşleştirmek için özel bir türünü kullanabilirsiniz.

Numaralandırma numaranızı belirtmek için özel bir öznitelik kullanarak numaralandırma sınıfınızda. Aşağıdaki makale bunu nasıl yapacağınıza yardımcı olabilir. yardımcı olur

http://david.gardiner.net.au/2007/11/using-enum-types-with-nhibernate.html

Umut. Benim hatırı sayılır hayretler

+0

Cevabınız için teşekkür ederiz. İlk bağlantının gerçekten alakalı olduğunu düşünmüyorum. İkinci bağlantı potansiyel bir çözümdür, ancak NHibernate uygulamamın dışında invaziv kodlamayı içerir - örn. Cinsiyet numarasına özel özellikler ekleyerek. Bunu NHibernate'in kendi içinde çözebilmeliydim. Şu anda özel bir IPropertyAccessor kullanıyorum, ancak işe almak mümkün görünmüyor ... – David

0

, bu haritalama çalıştı:

Map(x => x.Gender).Column("LS_GENDER").Access.CamelCaseField(Prefix.Underscore).CustomType(typeof (string)); 

Yani haritalama 'İlgili özellik tipi Cinsiyet olsa bile doğrudan alanını erişip bir dize olarak ele' diyor.

+0

Ah, ama sonra ben Cinsiyet üzerinde Linq sorguları yapamıyorum. Ben alırsınız: NHibernate.Criterion.SimpleExpression: Türü Türü yanlış eşleştirilmiş.Genel beklenen türü System.String, gerçek tip Kctc.Gender – David

+0

Belki kendi özel tipinizi sağlamak? –