gpt4 book ai didi

c# - EF 在不访问的情况下加载虚拟导航属性

转载 作者:太空宇宙 更新时间:2023-11-03 13:09:10 25 4
gpt4 key购买 nike

我有以下模型:

public class Category
{
public virtual ICollection<Product> Products{get;set;}
public Product()
{
Products = new HashSet<Product>();
}
}

public class Product
{
public Guid CategoryId{get;set;}
public virtual Category {get;set;}
}

现在如果我执行以下语句:

var list = await UoW.Categories.Query.Where(x=>x.Name.Contains("Mob")).ToListAsync();

并从 MVC Controller 操作中将 list 作为 JSON 返回。它抛出以下异常:

A circular reference was detected while serializing an object of type 
'System.Data.Entity.DynamicProxies.Category_7C2191CFExxxxxxx'.

这是因为 Products 集合不为空,并且每个 Product 依次包含 Category

虚拟属性(property)自动上传的原因是什么?

编辑:- 事实证明 Json Serializer 正在访问属性并导致 EF 加载它们。我已经按照 haim770 的建议关闭了 LazyLoading

最佳答案

原因是 Entity Framework Proxy 拦截了对您的 Products 属性的访问调用并自动填充它。

不过,您可以明确关闭延迟加载:

context.Configuration.LazyLoadingEnabled = false;

您还可以投影您的类别 列表到一个新列表中,并且只填充所需的属性。例如:

var list = await UoW.Categories.Query.Where(x=>x.Name.Contains("Mob"))
.Select(x => new Category {
Id = x.Id,
Name = x.Name
}).ToListAsync();

关于c# - EF 在不访问的情况下加载虚拟导航属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29800367/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com