避免或控制Entity Framework Core中的循环引用 [英] Avoid or control circular references in Entity Framework Core

查看:102
本文介绍了避免或控制Entity Framework Core中的循环引用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我真的已经完成了,但是至少我想知道发生了什么.我们开始:

I really am done with this, but at least I want to know what's going on. Here we go:

我的项目是一个具有Code First Entity Framework Core和Angular前端的ASP.NET Core Web应用程序.

My project is an ASP.NET Core Web Application with Code First Entity Framework Core and an Angular frontend.

我想控制何时加载引用的对象.它们可能很有用,但它们也可以创建在前端具有内部错误的循环引用.(JSON会无限长.)

I want to control when to load referenced objects. They can be useful, but they can also create circular references with internal errors on the frontend. (JSON would be infinitely long.)

型号:

class Book {
   public virtual ICollection<Page> Pages { get; set; }
   ...simple properties
}

class Page {
   public virtual Book Book { get; set; }
   ...simple properties
}

在此示例中, books 中的每本图书都会有一个空/空的 Pages 列表.

In this example, every book from books will have an empty/null Pages list.

using (var context = new MoneyStatsContext())
{
   var books = context.Books.Where(rule => rule.State == 1).ToList();
}

在此示例中, Pages 列表不为空,并且每个 Page 都将设置它的 Book 属性.这样就创建了一个循环引用.

In this example, the Pages lists are not null, and every Page will have it's Book property set. Thus creating a circular reference.

using (var context = new MoneyStatsContext())
{
   var books = context.Books.Where(rule => rule.State == 1).Include(x => x.Pages).ToList();
}

如何避免循环引用?除了创建新模型并手动指定每个属性外,我真的没有别的选择吗?

How do I avoid the circular reference? Do I really have no other (simpler) choice than creating a new model and manually specifying each property?

.Select(new Book() {
   ...setting each property by hand
}

我发现的无效解决方案:

  • 尝试将其设置为false和true.似乎没有任何改变.
public MyContext()
{
   this.ChangeTracker.LazyLoadingEnabled = false;
}


查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆