2010-01-13 4 views
3

Je suis un débutant NHibernate et fluent-nhibernate. Et j'ai un problème avec la contrainte unique et la cartographie nhibernate.Ajouter une contrainte unique multi-colonne sur une clé étrangère en utilisant la mise en correspondance fluide-nhibernate

J'ai la partie suivante du modèle de domaine.

public class Batch 
{ 
    public virtual int Id {get; set;} 
    public virtual string Name {get; set;} 
    public virtual IList<BatchParameter> BatchParameters {get; set;} 
} 
public class BatchParameter 
{ 
    public virtual int Id {get; set;} 
    public virtual string Name {get; set;} 
    public virtual Batch Batch {get; set;} 
} 

J'essaie d'utiliser couramment-NHibernate pour le mapper sur le db (SQLServer) en utilisant AutoMapping. Je veux mettre en place ma db afin d'avoir:

  • clés primaires sur les propriétés de « Id »

  • une clé étrangère sur la table BatchParamets

  • une unique contrainte sur la table de lots sur la colonne Nom

  • une contrainte unique sur la table BatchParameters sur les colonnes Nom et BATCH_ID

J'ai écrit ce code:

public class BatchMapping : IAutoMappingOverride<Batch> 
{ 
    public void Override(FluentNHibernate.Automapping.AutoMapping<Batch> mapping) 
    { 
     mapping.Id(b => b.Id); 
     mapping.HasMany<BatchParameter>(p => p.BatchParameters).Cascade.All().Inverse(); 
    } 
} 

public class BatchParameterMapping : IAutoMappingOverride<BatchParameter> 
{ 
    public void Override(FluentNHibernate.Automapping.AutoMapping<BatchParameter> mapping) 
    { 
     mapping.Id(b => b.Id); 
     mapping.Map(b => b.Name).Unique(); 
     //mapping.Map(p => p.Name).UniqueKey("Batch_Parameter"); 
     //mapping.Map(p => p.Batch.Id).UniqueKey("Batch_Parameter"); 
    } 
} 

Pas de problème pour les clés primaires, la clé étrangère et la première contrainte unique. Un peu de mal de tête pour la contrainte unique.

Quelqu'un peut-il me montrer la voie droite ???

Merci!

Répondre

0

Si l'ID et le nom sont des clés primaires dans votre table BatchParameter, vous aurez besoin d'un identifiant composite. Aussi, si vous voulez renvoyer une référence à Batch depuis votre classe BatchParameter, vous devrez utiliser Reference. Ce qui suit devrait être proche de ce que vous avez besoin:

public class BatchParameterMapping : IAutoMappingOverride<BatchParameter> 
{ 
    public void Override(FluentNHibernate.Automapping.AutoMapping<BatchParameter> mapping) 
    { 
     mapping.CompositeId() 
      .KeyProperty(x => x.Id) 
      .KeyProperty(x => x.Name); 

     mapping.References(x => x.Batch); 
    } 
} 
1

Tout d'abord, il semble que vous avez une erreur de copier-coller: ...Map(b => b.Name)... devrait aller BatchMapping, pas BatchParameterMapping.

public class BatchMapping : IAutoMappingOverride<Batch> 
{ 
    public void Override(AutoMapping<Batch> mapping) 
    { 
     mapping.Map(b => b.Name).Unique(); 
    } 
} 

Ensuite, BatchParameter.Batch est beaucoup à une relation BatchParameter-Batch, il devrait donc être mis en correspondance avec References(...) au lieu de Map(...). Vous utilisez References pour les clés étrangères à une autre entité et utilisez Map pour les propriétés simples.

public class BatchParameterMapping : IAutoMappingOverride<BatchParameter> 
{ 
    public void Override(AutoMapping<BatchParameter> mapping) 
    { 
     mapping.Map(p => p.Name).UniqueKey("Batch_Parameter"); 
     mapping.References(p => p.Batch).UniqueKey("Batch_Parameter"); 
    } 
} 

Enfin, vous devez supprimer les applications inutiles pour les Id propriétés et Batch.BatchParameters. Le mappage automatique de NHibernate par défaut les mappera comme souhaité par défaut. Dans vos méthodes Override, vous devez uniquement spécifier les propriétés dans lesquelles vous souhaitez effectuer quelque chose de différent de la définition automatique par défaut, telle que la spécification de clés uniques.

Questions connexes