如何映射我的类以使用自定义方法获取db的记录?

时间:2010-04-01 14:14:16

标签: c# asp.net asp.net-mvc nhibernate fluent-nhibernate

我正在使用ASP.NET MVC,NHibernate和Fluent NHibernate开发一个网站,并想知道如何使用自定义方法自定义Map以获取记录。

我的实体:

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

我的流利NHibernate地图:

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

并且,我的ImageRepository类上的方法:

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

如果我以这种方式创建对象:

ImageGallery ig = new ImageGallery();

我可以使用以下方式访问我的图片列表:

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

但是,ig.Images允许我访问所有图像记录,我想使用ListActive()的存储库方法访问只有活动记录(或其他标准)。

如何在地图上指定此内容?

非常感谢!

1 个答案:

答案 0 :(得分:1)

映射中的Where约束将图像始终限制为活动的:

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

如果要加载Images集合但是为活动记录动态过滤它,最好的方法是创建扩展方法:

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

然后你可以像这样访问活动记录:

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

我喜欢扩展方法解决方案,因为它可以在任何IEnumerable<Image>上使用,而不仅仅是ImageGallery上的集合。我肯定会使用这个解决方案,除非加载非活动图像是一个可衡量的性能问题。

如果您只想有选择地加载有效图片,请从reading this article about NHibernate Filters开始,因为我对它们没有任何使用经验。