views:

32

answers:

1

I'm developing a website with ASP.NET MVC, NHibernate and Fluent NHibernate and want to know how can I customize my Map to get records using a custom Method.

My entities:

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; }
}

My Fluent 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);
    }
}

And, a method on my ImageRepository class:

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

If I create an object this way:

ImageGallery ig = new ImageGallery();

I can access my the Image's list using:

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

However, ig.Images give me access to all images records and I would like to access just active records (or another criteria), using ListActive()'s repository methods.

How can I specify this on my Map?

Thank you very much!

+1  A: 

A Where constraint in the mapping will limit the Images to active ones always:

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");
    }
}

If you want to load the Images collection but dynamically filter it for active records, the best way is to create an extension method:

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

Then you can access the active records like this:

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

I like the extension method solution because it can be used on any IEnumerable<Image>, not just the collection on ImageGallery. I would definitely use this solution unless loading inactive images was a measurable performance problem.

If you want to selectively load active Images only then start by reading this article about NHibernate Filters because I don't have any experience with them.

Jamie Ide
Thank you! That have helped me a lot.
MCardinale