渴望加载。忽略自引用实体

时间:2014-04-29 07:57:30

标签: c# entity-framework lazy-loading eager-loading

我在我的应用程序中关闭了Lazy Load:

this.Configuration.LazyLoadingEnabled = false;

我的自引用实体类型是:

 public partial class Okved : BaseEntity
 {
        public Okved()
        {
            this.ChildOkveds = new HashSet<Okved>();
            this.TitleOkved = new HashSet<TitleOkved>();
        }

        public Nullable<int> OkvedId { get; set; }
        public string Code { get; set; }
        public string Name { get; set; }

        public virtual ICollection<Okved> ChildOkveds { get; set; }
        public virtual Okved ParentOkved { get; set; }
        public virtual ICollection<TitleOkved> TitleOkved { get; set; }
  }

但在我的Dao方法中,它返回所有实体,每个实体都有子实体,但它不应该......:

 public virtual List<T> All(Expression<Func<T, object>> include = null)
 {
        List<T> result;
        var query = DbConnection.BaseEntitySet.OfType<T>();

        if (include != null)
            query = query.Include(include);

        result = query.ToList();

        return result;
  }

enter image description here

那么,如何在查询中关闭包含自引用实体? 在其他情况下(当实体在其他类型实体上引用时),急切加载工作正常。

1 个答案:

答案 0 :(得分:1)

使用此声明

DbConnection.BaseEntitySet.OfType<T>();

您正在检索特定类型的所有实体,例如Okved

由于Okved具有相同类型的导航属性或此类型的集合,因此所有这些属性都将被初始化,因为这是上下文跟踪加载实体的方式。在实现某个实体之后,将更新在上下文中加载的所有其他实体,以便在它们指向新创建的实体时设置其导航属性。

要解决此问题,请调整您的Dao方法,使其不包含您不想要的属性信息。请注意,如果将entity属性设置为null,它将被视为实体更新,并且如果您调用实体的SaveChanges将会被处理。

另一种选择是使用MergeOption.NoTracking选项查询实体。

http://msdn.microsoft.com/en-us/library/system.data.objects.mergeoption.aspx