2010-09-10 13 views
1

J'ai un TrackLog qui contient une collection de points GPS comme un objet TrackPoint:Comment automatiser une collection de composants dans Fluent NHibernate?

public class TrackPoint 
{ 
    public virtual int Id { get; set; } 
    public virtual List<TrackPoint> TrackPoints { get;set; } 
} 

public class TrackLog 
{ 
    public virtual double Latitude { get; set; } 
    public virtual double Longitude { get; set; } 
    public virtual DateTime Timestamp { get; set; } 
} 

TrackPoint est un composant et je l'ai créé un IAutomappingConfiguration qui indique FNH à la carte comme tel. Cependant, lorsque je tente de lancer mon programme, FNH recrache l'exception suivante:

Références Association classe unmapped: TestProject.Components.TrackPoint

Comment puis-je mapper une collection de composants?

Répondre

1

J'ai trouvé mon problème. Rafael, en réponse à votre question, TrackLog a une collection de TrackPoints. Normalement dans ce cas, TrackPoint serait une entité, mais comme un TrackPoint ne devrait pas exister s'il n'appartient pas à un TrackLog, j'ai décidé d'en faire un composant, qui lie sa durée de vie à son parent TrackLog.

Il se trouve le problème que je faisais était que, même si je créé un remplacement de AutoMapping, il ne fonctionnait pas:

internal class TrackLogOverride : IAutoMappingOverride<TrackLog> 
{ 
    public void Override(AutoMapping<TrackLog> mapping) 
    { 
     mapping.HasMany(x => x.TrackPoints).Component(x => 
      { 
       x.Map(m => m.Latitude); 
       x.Map(m => m.Longitude); 
       x.Map(m => m.Timestamp); 
      }); 
    } 
} 

S'avère que je devais faire la classe de priorité public pour FNH à utilisez-les parce que j'utilisais FNH dans un autre assemblage.

0

La très première chose qui doit changer est de changer le type List à IList. La raison de ces besoins est que NHibernate doit injecter son propre type de collection, et non celui de C# List.

Ce que je ne comprends pas est TrackPoint en soi. Vous dites que c'est un composant qui se consume? Pourriez-vous nous donner plus de perspicacité? Je suis confus.

Dire que j'ai une piste de classe qui consomme TrackPoint en tant que composant:

public class TrackMap : ClassMap<TrackPoint> 
{ 
Id(x => x.Id); 

Component(x => x.TrackPoint, m => 
{ 
     m.Map(x => x.Id); 

     // Try one of the following (not sure): 
     m.Map(x => x.TrackPoints); 
     m.HasMany(x => x.TrackPoints); 
} 
} 

cette aide?

+0

Merci pour le conseil 'IList'! –