【发布时间】:2018-09-06 21:14:47
【问题描述】:
我不确定如何通过 .NET Core 应用程序使用 EF Core 来获取我需要的信息。我有两个数据库表 - 具有多对多关系的 OBJECTS 和 TAGS(使用第三个连接表 OBJECTTAGS)。我想获取所有对象(大约 1400 个)及其相关标签。
这是我的三个模型:
using System;
using System.Collections.Generic;
namespace ContentMarketplace.Models
{
public partial class Object
{
public int ObjectId { get; set; }
...
public virtual List<ObjectTag> ObjectTags { get; set; }
}
}
namespace ContentMarketplace.Models
{
public partial class Tag
{
public int TagId { get; set; }
...
public virtual List<ObjectTag> ObjectTags { get; set; }
}
}
namespace ContentMarketplace.Models
{
public partial class ObjectTag
{
public int ObjectId { get; set; }
public virtual Object Object { get; set; }
public int TagId { get; set; }
public virtual Tag Tag { get; set; }
}
}
这就是我的上下文中 OnModelCreating() 方法中的内容:
modelBuilder.Entity<ObjectTag>(entity =>
{
entity.HasKey(e => new { e.ObjectId, e.TagId });
entity.HasOne(ot => ot.Object)
.WithMany(o => o.ObjectTags)
.HasForeignKey(ot => ot.ObjectId);
entity.HasOne(ot => ot.Tag)
.WithMany(t => t.ObjectTags)
.HasForeignKey(ot => ot.TagId);
});
当我尝试在 ObjectController.cs 中返回数据时会出现此问题
namespace ContentMarketplace.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class ObjectController : ControllerBase
{
private readonly ContentMarketplaceContext _context;
public ObjectController(ContentMarketplaceContext context)
{
_context = context;
}
[HttpGet]
public ActionResult<List<ContentMarketplace.Models.Object>> GetAll()
{
return _context.Objects
.Include(o => o.ObjectTags)
.ThenInclude(ot => ot.Tag)
.ToList();
}
}
}
Include().ThenInclude() 创建一个循环关系,其中 HTTP 请求不仅返回与每个对象关联的标签信息,而且还返回与每个标签关联的所有对象等等,从而使浏览器崩溃。
如果我取出 ThenInclude() 它可以正常工作,但不会返回不在我的 ObjectTag 模型中的所有标签信息。
我知道这与 EF Core 自动加载已经在上下文中的东西有关(比如这里的“提示”注释 https://docs.microsoft.com/en-us/ef/core/querying/related-data),但我不知道还有什么方法可以返回对象和标签而不执行任何操作进一步。
【问题讨论】:
-
错误是来自 JSON 序列化程序还是来自 EF Core?
标签: c# asp.net-core entity-framework-core