【问题标题】:Eager loading. Ignore Self-referencing entities急于加载。忽略自引用实体
【发布时间】:2014-04-29 07:57:30
【问题描述】:

我在我的应用程序中关闭了延迟加载:

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

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

【问题讨论】:

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


    【解决方案1】:

    有了这个声明

    DbConnection.BaseEntitySet.OfType<T>();
    

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

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

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

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

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

    【讨论】:

    • 非常感谢。 var query = DbConnection.BaseEntitySet.AsNoTracking().OfType();为我工作。但我不明白 AsNoTracking 在做什么 =)。将阅读有关 EF 的书籍。
    • 阅读我提供的链接中有关 MergeOption.NoTracking 的信息
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-17
    • 1970-01-01
    相关资源
    最近更新 更多