我在我的应用程序中关闭了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;
}
那么,如何在查询中关闭包含自引用实体? 在其他情况下(当实体在其他类型实体上引用时),急切加载工作正常。
答案 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