2009-08-26 7 views
9

Je suis nouveau pour NHibernate et Fluent NHibernate.Fluid NHibernate mapping

En supposant que j'ai une situation comme suit

Table Activities (uniquidentier ID, varchar ActivityName) 
Table ActivityParameters(uniqueidentifier ID, varchar ParameterName, 
varbinary(8000) ParameterValue) 

et la classe suivante

public static Acivity 
{ 
    ....... 
    public virtual Guid Id {get; private set;}  
    public virtual string ActivityName {get; private set;} 
    public virtual IDictionary<string, object> ActivityParameters {get; private set;} 
} 

comment puis-je écrire le classmap? Plus spécifiquement, comment puis-je écrire le mapping pour les paramètres d'activité?

Répondre

16

un collègue a e à this site.

sur la base de cette discussion, je Venir au

Table("Activities"); 
     Id(x => x.Id).Column("ID").GeneratedBy.Guid(); 
     Map(x => x.ActivityName).Not.Nullable().Length(50); 
     HasMany(x => x.ActivityParameters) 
      .KeyColumn("ActivityID") 
      .AsMap<string>(idx => idx.Column("ParameterName"), elem => elem.Column("ParameterValue")) 
      .Not.LazyLoad() 
      .ForeignKeyCascadeOnDelete() 
      .Table("ActivityParameters"); 

Je dois tester ceci.

+0

Ca marche !!! Merci à vous tous d'avoir indiqué la direction! – DaeMoohn

+3

Excellent travail à venir avec votre propre solution. Votez pour ça ... – Skittles

0

This semble utile.

Théoriquement, il devrait ressembler à:

public class ActivityClassMap : ClassMap<Activity> 
{ 
    ... 
    HasMany(x => x.ActivityParameters) 
     .AsMap(x=>x.NameOfParameterOrWhatever) 
     .KeyColumnNames.Add("ParameterId"); 
    ... 
} 

Mais c'est juste une petite enquête sur Google - Je n'ai pas essayé cela en pratique.

P.s. n'oubliez pas de prendre la dernière version.

+0

Merci beaucoup, je vais essayer. Merci encore! – DaeMoohn

0

Sur la base de votre conseil, je suis venu à:

WithTable("Activities"); 
Id(x => x.Id).ColumnName("ID").GeneratedBy.Guid(); 
Map(x => x.ActivityName).Not.Nullable().WithLengthOf(50); 
HasMany(x => x.ActivityParameters) 
     .Cascade.Delete() 
     .KeyColumnNames.Add("ActivityID") 
     .AsMap("ParameterName") 
     .AsMap("ParameterValue") 
     .WithTableName("ActivityParameters"); 

mais je reçois une erreur, les références Association classe unmapped: System.Object. :(

modifier plus tard: Je suis la dernière version de Fluent, et maintenant le code ressemble à ceci:

Table("Activities"); 
     Id(x => x.Id).Column("ID").GeneratedBy.Guid(); 
     Map(x => x.ActivityName).Not.Nullable().Length(50); 
     HasMany(x => x.ActivityParameters) 
      .KeyColumn("ActivityID") 
      .ForeignKeyCascadeOnDelete() 
      .Table("ActivityParameters"); 
0

Vous avez réellement besoin de définir ce type d'objet que votre propriété valeur IDictionary contient - NHibernate ne sait pas comment la carte. vous devez utiliser une classe spécifique au lieu de. Ensuite, vous spécifiez le mappage pour cette classe ainsi.

-1

Veuillez pardonner mon ignorance.

J'ai travaillé avec NHibernate il y a environ 6 mois et j'optais toujours pour le mappage d'intégration XML, puis pour compiler les mappages XML dans la bibliothèque ou quoi que ce soit.

Est-ce nouveau pour mapper des tables relationnelles et des objets de classe directement à partir du code?

J'ai entendu dire que cela venait d'une certaine façon avec Entity Framework en spécifiant le mappage juste au-dessus de chaque élément d'une classe entre crochets. Ainsi, comme Entity Framework était uniquement destiné à SQL Server, nous ne pouvions pas penser à l'utiliser car nous travaillions dans un environnement multi-DB avec SQL Server, Oracle et SQLite.

Merci pour tout éclairage sur le sujet! :-)

+0

Il s'agit d'une approche alternative à l'écriture de fichiers hbm.xml. – DaeMoohn

+0

Merci pour votre réponse! Je m'intéresserai de nouveau à NHibernate. –