【发布时间】:2021-08-26 12:34:12
【问题描述】:
我在我的 EF Core 项目中设置了以下实体模型:
public class ForumPost
{
[Key]
public int Id { get; set; }
public string Title { get; set; }
// ...some other properties
public List<Tag> Tags { get; set; }
}
public class Tag
{
[Key]
public string Name { get; set; }
public string Description { get; set; }
// ...some other properties
public List<ForumPost> Posts { get; set; }
}
所以我在帖子和标签之间有多对多的关系。我的OnModelCreating 中没有关系配置。
我的上下文设置如下:
public class ForumsContext : DbContext
{
public DbSet<ForumPost> Posts { get; set; }
public DbSet<Tag> Tags { get; set; }
}
当我如下查询我的ForumsContext 时:
var posts = await context.Posts.Include(p => p.Tags).ToListAsync();
EF 为posts 中每个ForumPost 对象中的每个Tag 对象自动填充Posts 字段。我无法弄清楚为什么会发生这种情况,如果我要将上面的 posts 列表序列化为 JSON,它会由于对象循环 (Post->Tags->Posts->Post) 而引发异常。
为什么要填充标签的帖子列表?如何告诉 EF 不要填充此列表。
【问题讨论】:
-
所以问题与 EF Core 完全无关,它与 JSON 和循环引用有关。您使用的是哪个 JSON 库? JSON.NET? System.Text.Json?您可以找到询问如何处理任一循环引用的问题
-
一个非常非常好的建议是不要使用您的数据模型作为您的响应模型。除了非常简单的情况外,每一个都需要不同的关系,不同的领域。您可能不想在任何 JSON 模型中显示某些字段,因为它们是噪音(例如
Created等审计字段)或敏感字段(例如信用卡号) -
您使用的是哪个 .NET Core 版本? System.Text.Json 可以handle circular references in .NET 5 and later。您还可以将
[JsonIgnore]属性添加到Tag.Posts。
标签: c# json .net entity-framework-core