2

我有以下型号

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 添加到上述加载代码中,以确保在从数据库加载记录时加载所有关系树(产品-> 系列-> 品牌)。

任何人都知道我可以如何做通用的 SetFetchmode 吗?

4

1 回答 1

1

It would be easiest to specify eager loading in the mapping files for each entity, this is done by adding the Fetch specification.

If you are using Fluent nHibernate then this should do it:

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

If you put this inside your Product mapping it tells nHiberate to eager load the Series whenever a Product is loaded.

Likewise put something similar in your Series to load the Brand.

于 2013-05-30T07:21:00.477 回答