2010-11-19 16 views
0

J'ai une base de données avec un champ 'LS_GENDER' qui stocke les genres comme 'M' ou 'F'.FluentNHibernate: comment accéder au champ dont le type de données est différent de la propriété

Mon application utilise une énumération appelée genre à travailler avec les sexes.

Mon entité a le champ suivant et la propriété:

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; 
    } 
} 

Comment puis-je mapper cela avec FluentNHibernate? Je suis en train d'utiliser l'accès sur le terrain (comme indiqué ci-dessous):

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

mais je reçois l'erreur « ne peut pas analyser F comme genre ». Je pense que NHibernate devient confus parce que la propriété et le champ ne sont pas du même type.

Comment dois-je mapper ce?

Répondre

0

vous associez un champ privé à l'aide reveal:

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

Mais cela ne résout pas votre problème LINQ parce que maintenant NHibernate ne connaît pas la propriété du genre. Pour résoudre ces deux problèmes, j'utiliserais un type d'utilisateur personnalisé qui implémente IUserType.

+0

J'ai résolu ceci en utilisant IUsertype. Aim Kai a également parlé de IUserType, mais moins directement. – David

0

Je suppose que vous mappez une valeur de chaîne de base de données (M, F, U) à une énumération.

La réponse à cette question peut vous aider à tracer énumérations à des valeurs de chaîne.

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

Vous pouvez utiliser un type personnalisé pour cartographier les chaînes (M, F, U) à l'énumération que vous avez.

Sur votre classe d'énumération à l'aide d'un attribut personnalisé pour spécifier sa valeur de chaîne. L'article suivant peut vous aider à faire cela.

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

espoir qui aide.

+0

Merci pour votre réponse. Je ne pense pas que le premier lien soit vraiment pertinent. Le second lien est une solution potentielle, mais implique un codage invasif en dehors de ma mise en œuvre de NHibernate - par ex. ajouter des attributs personnalisés à l'énumération de genre. Je devrais pouvoir résoudre ceci au sein de NHibernate lui-même. J'utilise actuellement un IPropertyAccessor personnalisé, mais je ne semble pas pouvoir le faire fonctionner ... – David

0

À mon grand étonnement considérable, cette cartographie a travaillé:

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

Ainsi, le mappage dit « accéder au champ directement et traiter comme une chaîne, même si la propriété correspondante est de type genre ».

+0

Ah, mais je ne peux pas faire de requêtes Linq sur le genre. Je reçois: incompatibilité de type dans NHibernate.Criterion.SimpleExpression: Deceased.Gender System.String de type attendu, type réel Kctc.Gender – David

+0

fournir Peut-être votre propre type personnalisé? –