在泛型类中使用FluentNhibernate进行加载

时间:2013-05-30 06:40:46

标签: c# nhibernate fluent-nhibernate

我有以下型号

public class BaseEntity
{
    public virtual int EntityID { get;set; }
    public virtual bool Active { get;set; }
}

public class Brand : BaseEntity
{
   public Brand()
   {
      Series = new List<Series>();
   }

   public virtual string BrandName { get;set; }
   public virtual string Website { get;set; }
   public virtual IList<Series> Series;
}

public class Series: BaseEntity
{
   public Series()
   {
      Products = new List<Product>();
   }

   public virtual Brand Brand { get;set; }
   public virtual string SeriesName { get;set; }
   public virtual string SeriesDescription { get;set; }
   public virtual IList<Product> Products;
}

public class Product : BaseEntity
{
   public Product()
   {
      Series = new List<Series>();
   }

   public virtual Series Series { get;set; };
   public virtual string ProductName { get;set; }
   public virtual string ProductCode { get;set; }
   public virtual string ProductDescription { get;set; }
   public virtual double SellingPrice { get;set; }
}

我已将所有映射设置为不延迟加载。

public class BrandMapping() : ClassMap<Brand>
{

    public BrandMapping()
    {
       Table("Brand");
       Id(item => item.EntityID).Column("BrandID").GeneratedBy.Increment();
       Map(item => item.BrandName).Not.LazyLoad();
       Map(item => item.Active).Not.LazyLoad();
       Map(item => item.Website).Not.LazyLoad();
       HasMany<Series>(item => item.Series).Cascade.All().Not.LazyLoad();
    }
}

public class SeriesMapping() : ClassMap<Series>
{

    public SeriesMapping()
    {
       Table("Series");
       Id(item => item.EntityID).Column("SeriesID").GeneratedBy.Increment();
       Map(item => item.SeriesName).Not.LazyLoad();
       Map(item => item.SeriesDescription).Not.LazyLoad();
       Map(item => item.Active).Not.LazyLoad();
       HasMany<Product>(item => item.Products).Cascade.All().Not.LazyLoad();
       Reference<Brand>(item => item.Brand).Column("BrandID");
    }
}


public class ProductMapping() : ClassMap<Product>
{

    public ProductMapping()
    {
       Table("Product");
       Id(item => item.EntityID).Column("ProductID").GeneratedBy.Increment();
       Map(item => item.ProductName).Not.LazyLoad();
       Map(item => item.ProductDescription).Not.LazyLoad();
       Map(item => item.ProductCode).Not.LazyLoad();
       Map(item => item.SellingPrice).Not.LazyLoad();
       Map(item => item.Active).Not.LazyLoad();
       Reference<Series>(item => item.Series).Column("ProductID");
    }
}

我有一个通用的Repository库,它具有Load方法的以下代码,因此我不需要为每个类型的Repo创建代码:

IEnumerable<T> Load()
{
    IList<T> results = new List<T>();

    StartTransaction();
    results = _session.CreateCriteria(typeof(T)).List<T>();
    CommitTransaction();

    return results;
}

我的问题是我的一个屏幕显示产品。此屏幕需要在网格中显示系列和品牌名称的完整性。我发现即使禁用延迟加载,系列也不会被加载,更不用说品牌记录了。我需要找到一种方法将SetFetchMode添加到上面的加载代码中,以确保在从DB加载记录时加载所有关系树(Product-&gt; Series-&gt; Brand)。

任何人都知道如何进行通用的SetFetchmode?

1 个答案:

答案 0 :(得分:1)

最简单的方法是在每个实体的映射文件中指定预先加载,这可以通过添加Fetch规范来完成。

如果您正在使用Fluent nHibernate,那么应该这样做:

  References(x => x.Series).Column("SeriesId").ForeignKey("Id").Fetch.Join();

如果你把它放在你的产品映射中,它会告诉nHiberate在加载产品时急切加载系列。

同样在你的系列中添加类似的内容来加载品牌。