32 votes

Cartographie enum avec nhibernate fluide

Je suis à la suite de la http://wiki.fluentnhibernate.org/Getting%5Fstarted tutoriel pour créer mon premier NHibernate projet avec NHibernate Fluent

J'ai 2 tables

1) Compte avec des champs

Id
AccountHolderName
AccountTypeId

2) AccountType avec des champs

Id
AccountTypeName

Actuellement, les types de compte peut être d'Épargne ou de Courant De sorte que le tableau AccountTypes magasins 2 lignes 1 - l'Épargne 2 - Courant

Pour AccoutType table, j'ai défini enum

public enum AccountType {
    Savings=1,
    Current=2
}

Pour le Compte de la table de définir la classe d'entité

public class Account {
    public virtual int Id {get; private set;}
    public virtual string AccountHolderName {get; set;}
    public virtual string AccountType {get; set;}
}

La fluidité de la nhibernate mappages sont:

public AgencyMap() {
    Id(o => o.Id);
    Map(o => o.AccountHolderName);
    Map(o => o.AccountType);
}

Lorsque j'essaie d'exécuter la solution, il donne une exception - InnerException = {"(XmlDocument)(2,4): erreur de validation XML: L'élément de "classe" dans l'espace de noms 'urn:nhibernate-cartographie-2.2' a un contenu incomplet. Liste des éléments possibles attendu: "meta-ci, de cache, de synchroniser, de commentaire, tuplizer, id, composite-id' dans l'espace de noms 'ur...

Je suppose que c'est parce que je n'ai pas speciofied toute la cartographie pour AccountType.

Les questions sont:

  1. Comment puis-je utiliser AccountType enum au lieu d'un AccountType classe?
  2. Je vais peut-être sur la mauvaise voie. Est-il une meilleure façon de le faire?

Merci!

63voto

Dann Points 4231

Que diriez-vous de faire cela:

 public AgencyMap() {
    Id(o => o.Id);
    Map(o => o.AccountHolderName);
    Map(o => o.AccountType).CustomType<int>();
}
 

Le type personnalisé gère tout :)

37voto

mhenrixon Points 3178
 public class Account {
    public virtual int Id {get; private set;}
    public virtual string AccountHolderName {get; set;}
    public virtual AccountType AccountType {get; set;}
}

public AgencyMap() {
    Id(o => o.Id);
    Map(o => o.AccountHolderName);
    Map(o => o.AccountType);
}
 

Fluent NHibernate enregistre les valeurs d'énumération sous forme de chaîne par défaut si vous souhaitez remplacer que vous devez lui fournir une convention. Quelque chose comme:

 public class EnumConvention :
    IPropertyConvention, 
    IPropertyConventionAcceptance
{
    #region IPropertyConvention Members

    public void Apply(IPropertyInstance instance)
    {
        instance.CustomType(instance.Property.PropertyType);
    }

    #endregion

    #region IPropertyConventionAcceptance Members

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

    #endregion
}
 

J'ai presque oublié que vous devez également ajouter la convention à votre configuration courante. Vous faites cela au même endroit que vous ajoutez les mappages:

 .Mappings(m => m.FluentMappings.AddFromAssemblyOf<BillingRecordMap>()
.Conventions.AddFromAssemblyOf<EnumConvention>()
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X