【问题标题】:Load only a single associated entity仅加载单个关联实体
【发布时间】:2011-05-26 19:43:56
【问题描述】:

我有存储库来管理 ComplaintTypes 上的操作,它有大量关联实体,所以我定义。不想加载所有内容,因此我有LazyLoadingEnabled = true;。但是我确实想加载一个关联实体,例如:ComplaintSubType

这对我有用,但我认为有更好的方法吗?谢谢!

namespace Complaint.Dal.Repositories
{
    public class ComplaintTypeRepository : RepositoryBase<ComplaintType>, IComplaintTypeRepository
    {
        #region ctor

        /// <summary>
        /// ctor
        /// </summary>
        /// <param name="objectContext"></param>
        public ComplaintTypeRepository(IObjectContext objectContext)
            : base(objectContext)
        {
            //Lazy Load so we don't get bloated data
            objectContext.LazyLoadingEnabled = true;
        }

        #endregion

        #region Implementation of IComplaintRepository

        public IEnumerable<ComplaintType> GetAllComplaintTypes()
        {
            //Load the related SubTypes
            var result = GetAll(t => t.PK_Type_Id);
            foreach (var complaintType in result)
            {
                complaintType.ComplaintSubType.Load();
            }
            return result;
        }

        public ComplaintType GetComplaintType(int typeId)
        {
            var result = GetSingle(t => t.PK_Type_Id == typeId);
            result.ComplaintSubType.Load();
            return result;
        }

        public void UpdateComplaintType(ComplaintType entity)
        {
            Attach(entity);
        }

        #endregion
    }
}

更新:

public IEnumerable<T> GetAll<TKey, TType>(Expression<Func<T, TKey>> orderBy)  
{  
    var ret = ObjectSet;  
    //set Orderby  
    ret.OrderBy(orderBy);  
    return ret.ToList();  
}

【问题讨论】:

    标签: asp.net entity-framework repository-pattern n-tier-architecture


    【解决方案1】:

    你可以实现这样的东西

    存储库库

    public virtual IQueryable<TEntity> BuildQuery(IQueryable<TEntity> query)
    {
        return query;
    }
    
    public IQueryable<TEntity> GetQuery()
    {
        return BuildQuery(_objectSet);
    }
    
    public IEnumerable<T> GetAll<TKey, TType>(Expression<Func<T, TKey>> orderBy)  
    {  
        var ret = GetQuery();  
        //set Orderby  
        ret.OrderBy(orderBy);  
        return ret.ToList();  
    }
    

    在 ComplaintTypeRepository...

    public override IQueryable<TEntity> BuildQuery(IQueryable<TEntity> query)
    {
        return query.Include("ComplaintSubType");
    }
    

    【讨论】:

      【解决方案2】:

      将 LazyLoadingEnabled 设置为 true,您应该不再需要直接显式加载 ComplaintSubType;每当有东西触及该属性时,EF 应该为您加载它。或者,您可以使用 Include("ComplaintSubType") 方法将其与 ComplaintType 同时加载;这将是这里的最佳选择。

      HTH。

      【讨论】:

      • 抱歉,忘了说我使用的是 n 层拱门。所以实体没有被附加。
      • 好的,那么为了完全理解要告诉您的内容,我需要了解更多您的基本架构,GetAll 和 GetSingle 方法...
      猜你喜欢
      • 2014-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-12
      相关资源
      最近更新 更多