2009-05-19 7 views
1

J'essaie d'obtenir le modèle AutoPersistence pour mapper plusieurs éléments composites. Cependant, il semble que soit je finisse par le mapper en tant qu'entité, en passant à la cartographie manuelle, soit cela ne marche pas. Voici un code qui illustre mon problème:..AutoMapping d'un élément composite dans Nhibernate Fluent

using System; 
using System.Collections.Generic; 
using FluentNHibernate.AutoMap; 
using FluentNHibernate.Cfg; 
using FluentNHibernate.Conventions.Helpers; 
using NHibernate.Cfg; 

namespace Scanner { 
    public class Root { 
     public int Id { get; set; } 
     public string Name { get; set; } 
     public ICollection<Component> Components { get; set; } 
    } 

    public class Component { 
     public string Name { get; set; } 
    } 

    class Example { 
     public void DoesntGetComponents() 
     { 
      Configuration configuration = new Configuration(); 
      configuration.SetProperty("ConnectionString", ""); 
      configuration.SetProperty("dialect", "NHibernate.Dialect.MsSql2005Dialect"); 
      var config = Fluently.Configure(configuration) 
       .Mappings(m => m.AutoMappings.Add(AutoMapping)) 
       .BuildConfiguration(); 
      var sql2005 = new NHibernate.Dialect.MsSql2005Dialect(); 
      foreach (var line in config.GenerateSchemaCreationScript(sql2005)) 
      { 
       Console.WriteLine(line); 
      } 
     } 

     static AutoPersistenceModel AutoMapping() { 
      AutoPersistenceModel model = new AutoPersistenceModel(); 
      return model 
       .AddEntityAssembly(typeof(Root).Assembly) 
       .WithSetup(e => e.IsComponentType = t => t == typeof(Component)) 
       .Where(t => t == typeof(Root)) 
       .MergeWithAutoMapsFromAssemblyOf<Root>() 
       .ConventionDiscovery.Add(ForeignKey.Format((p, t) => (p == null ? t.Name : p.Name) + "Id")) 
       .ConventionDiscovery.Add(Table.Is(t => t.EntityType.Name)) 
      ; 
     } 
    } 
} 

(Désolé, il est si long, mais il est le code minimal requis pour démontrer le problème Cette version particulière du code ne parvient pas à enregistrer à tout type de composant

Alors, qu'est-ce que je fais mal?

+0

Je voudrais pouvoir fermer cette question sur la base que Ce n'était plus pertinent. Je ne suis pas convaincu que tout nouveau travail utiliserait FNH maintenant que NH a des caractéristiques similaires. –

+0

La version actuelle de NH (3.2 au moment où j'écris ceci) ne fait toujours pas Automapping à la FNH, ce qui est une bonne raison de continuer avec FNH, IMO. –

+0

Point pris. Je suis un peu d'avis que la plupart de la cartographie automatique est en réalité plus facile à mettre en œuvre que d'essayer de faire fonctionner le système de quelqu'un d'autre. J'ai renoncé à l'auto-cartographie FNH longtemps avant de laisser tomber FNH. –

Répondre

1

Il semble que le composant en lui-même n'est pas le problème, mais la cartographie d'une collection de composants.Si vous souhaitez mapper le composant directement sur la classe Racine, ce ne serait pas n'importe quel problème

Une solution possible fait la classe composant une entité (ajout d'une carte d'identité) et en remplaçant la cartographie des composants en cascade + supprimer automatiquement les orphelins:

AutoPersistenceModel 
.ForTypesThatDeriveFrom<Root>(map => map.HasMany(root => root.Components).Cascade.AllDeleteOrphan())