2009-12-21 5 views
2

J'ai une entité comme ceci:Comment mapper un dictionnaire en utilisant le mappage NHibernate Fluent?

public class Land 
{ 
    public virtual IDictionary<string, int> Damages { get; set; } 
    // and other properties 
} 

Chaque fois que j'essaie d'utiliser AutoMapping avec le code suivant:

var sessionFactory = Fluently.Configure() 
    .Database(SQLiteConfiguration.Standard.InMemory) 
    .Mappings(m => m.AutoMappings.Add(AutoMap.AssemblyOf<Land>)) 
    .BuildSessionFactory(); 

je reçois l'erreur suivante:

{"The type or method has 2 generic parameter(s), but 1 generic argument(s) were 
provided. A generic argument must be provided for each generic parameter."} 

Quelqu'un peut-il dis-moi ce que je fais mal? En outre, ceci est juste un exemple simple. J'ai beaucoup plus de dictionnaires que celui-ci.

+0

http://stackoverflow.com/questions/1410716/fluentnhibernate-mapping-for-dictionary Essayez AsMAP() –

Répondre

9

C'est impossible avec NHibernate.

+0

Voulez-vous dire que cela soit impossible avec Fluent NHibernate automapping, Fluent NHibernate dans son ensemble (signifiant avec les applications fluides ainsi), ou NHibernate lui-même? –

+0

NHibernate elle-même. Je ne connais aucun ORM qui pourrait automatiser le dictionnaire au moment présent. – user224564

+8

Vous avez raison, vous devez le mapper manuellement. En utilisant Fluent, ce serait 'Références (x => x.Dictionary) .AsMap (" keyColumn "). Element (" valueColumn ", c => c.Type ());'. –

3

Trouvé quelques traces que ce isn't possible. Quelques traces, que it's recently implemented.

Toujours à l'étude. :)


This looks quite promising (n'a pas encore testé).

Ainsi, dans votre cas, il devrait ressembler =>

public class LandMap : ClassMap<Land> 
{ 
    public LandMap() 
    { 
     (...) 

     HasMany(x => x.Damages) 
      .WithTableName("Damages") 
      .KeyColumnNames.Add("LandId") 
      .Cascade.All() 
      .AsMap<string>(
       index => index.WithColumn("DamageType").WithType<string>(), 
       element => element.WithColumn("Amount").WithType<int>() 
      ); 
    } 
} 

Gardez à l'esprit - il devrait. Je ne l'ai pas testé.

+0

Voilà pour la cartographie couramment. Je suis à la recherche de quelque chose qui fonctionne pour l'automapping car j'ai environ 50 dictionnaires dans toutes mes entités. –

+0

Ahhh ... désolé. D'une manière ou d'une autre n'a pas remarqué 'automapping'. Je regarderai. :) –

1

Une solution possible qui devrait dans le travail de la théorie avec AutoMapping:

public class DamagesDictionary : Dictionary<string, int> 
{ 
} 

Land.cs

public class Land 
{ 
    public virtual DamagesDictionary Damages { get; set; } 
    // and other properties 
} 

ou une approche plus générique ...

public class StringKeyedDictionary<T> : Dictionary<string, T> 
{ 
} 

Land.cs

public class Land 
{ 
    public virtual StringKeyedDictionary<int> Damages { get; set; } 
    // and other properties 
} 
+0

Je pense que c'est une réponse sous-estimée - plus simple parfois de faire un autre POCO avec 2 propriétés sur elle (clé, valeur) et référence que si vous ne pouvez pas être dérangé pour écrire les mappings (Lazy, yes .. Recommender, no .. . mais...) – Darbio