2010-04-01 4 views
0

Je développe un site Web avec ASP.NET MVC, NHibernate et Fluent NHibernate et je veux savoir comment personnaliser ma carte pour obtenir des enregistrements en utilisant une méthode personnalisée.Comment mapper ma classe pour obtenir les enregistrements de DB avec une méthode personnalisée?

Mes entités:

public class ImageGallery { 
    public virtual int Id { get; set; } 
    public virtual string Titulo { get; set; } 
    public virtual IList<Image> Images { get; set; } 
    public virtual bool IsActive { get; set; } 
} 
public class Image { 
    public virtual int Id { get; set; } 
    public virtual ImageGallery ImageGallery { get; set; } 
    public virtual string Low { get; set; } 
    public virtual bool IsActive { get; set; } 
} 

Mon Courant NHibernate Maps:

public class ImageGalleryMap:ClassMap<ImageGallery> { 
    public ImageGalleryMap() { 
     Id(x => x.Id); 
     Map(x => x.Titulo); 
     HasMany(x => x.Images) 
      .KeyColumn("ImageGalleryID"); 
     Map(x => x.IsActive); 
    } 
} 
public class ImageMap:ClassMap<Image> { 
    public ImageMap() { 
     Id(x => x.Id); 
     References(x => x.ImageGallery); 
     Map(x => x.Low); 
     Map(x => x.IsActive); 
    } 
} 

Et une méthode sur ma classe ImageRepository:

public IList<Image> ListActive() { 
     return this.Session.CreateCriteria<Image>() 
          .Add(Restrictions.Eq("IsActive", true)) 
        .List<Image>(); 
    } 

Si je crée un objet de cette façon:

ImageGallery ig = new ImageGallery(); 

Je peux accéder à ma liste de l'image en utilisant:

foreach(Image img in ig.Images) { 
    ... 
} 

Cependant, ig.Images me donnent accès à tous les dossiers d'images et je voudrais accéder seulement des documents actifs (ou un autre critère), en utilisant listactive() Les méthodes du référentiel.

Comment puis-je le spécifier sur ma carte?

Merci beaucoup!

Répondre

1

A Lorsque la contrainte dans la cartographie limitera les images à celles actives toujours:

public class ImageMap:ClassMap<Image> { 
    public ImageMap() { 
     Id(x => x.Id); 
     References(x => x.ImageGallery); 
     Map(x => x.Low); 
     Map(x => x.IsActive); 
     Where("IsActive = 1"); 
    } 
} 

Si vous voulez charger la collection d'images mais filtrer dynamiquement les enregistrements actifs, la meilleure façon est de créer une extension méthode:

public static IEnumerable<Image> Active(this IEnumerable<Image> images) 
{ 
    return images.Where(x => x.IsActive); 
} 

Ensuite, vous pouvez accéder aux dossiers actifs comme ceci:

foreach(Image img in ig.Images.Active()) { 
    ... 
} 

J'aime la solution de méthode d'extension car elle peut être utilisée sur n'importe quel IEnumerable<Image>, pas seulement sur la collection sur ImageGallery. J'utiliserais certainement cette solution à moins que le chargement d'images inactives soit un problème de performance mesurable.

Si vous souhaitez charger uniquement les images actives, commencez par reading this article about NHibernate Filters car je n'ai aucune expérience avec elles.

+0

Merci! Cela m'a beaucoup aidé. – MCardinale

Questions connexes