【问题标题】:Entity Framework Core Parent Child items in the same model, children node returns nullEntity Framework Core 同模型中的父子项,子节点返回null
【发布时间】:2020-02-20 13:13:47
【问题描述】:

我在一个域模型中有一个父子属性。

public class TestModel
{
    public int ParentID { get; set; }
    public int ID{ get; set; }
    public string Name{ get; set; }
    public virtual TestModel parent { get; set; }
    public virtual List<TestModel> children { get; set; }
}

当我写OnModelCreating事件如下:

builder.Entity<TestModel>().HasOne(b => b.parent).WithMany(a => a.children).HasForeignKey(b => b.ID);

在调试模式下,子节点返回相同的层次结构,并且在 JsonConvert.SerializeObject 上出现“为属性“父”检测到具有类型 TestModel 的自引用循环”错误。

当我改变OnModelCreating事件如下:

builder.Entity<TestModel>().HasOne(b => b.parent).WithMany(a => a.children).HasForeignKey(b => b.ParentID);

然后 children 属性返回 null。我怎么解决这个问题?如何正确加载子属性?

我希望有人可以帮助我。

PS:TestModel 不在任何上下文中,所以我不能包含。我创建了一个 sql 查询并使用 FromSql()

【问题讨论】:

  • 我想当你使用 b.ID 时,链接是 ID 字段,但是当你使用 ParentID 时,你使用的是其他信息,所以你可以有零行
  • 获取实体时是否使用.Include(x => x.children)?
  • 您的问题似乎与 JSON.NET 而不是实体框架有关。默认情况下,它不会序列化自引用对象。在这里查看:newtonsoft.com/json/help/html/…
  • 抱歉,TestModel 不在任何上下文中,所以我不能包含。我创建了一个 sql 查询并使用 FromSql()

标签: c# asp.net entity-framework entity-framework-core


【解决方案1】:

第二个是正确的,但我怀疑在加载时,您并没有急切地取孩子。试试这个:

var one = context.Set<TestModel>().Include(x => x.children).FirstOrDefault();

另一种选择是使用延迟加载。在此处查看更多信息:https://docs.microsoft.com/en-us/ef/core/querying/related-data

【讨论】:

  • 抱歉,TestModel 不在任何上下文中,所以我不能包含。我创建了一个 sql 查询并使用 FromSql()
  • 您可以将 Include 与 FromSql 一起使用:docs.microsoft.com/en-us/ef/core/querying/raw-sql。使用Set,然后在里面调用FromSql。
  • var one = context.Set().Include(x => x.children).FromSql(sql).FirstOrDefault();我试过这个,但我得到一个错误,比如:'无效的对象名称'TestModel'。'
  • 那是因为表名和类名不匹配。您如何使用 FromSql,您从哪里调用它?
  • 在你的建议之后,我当然遇到了语法错误,我是 ef 的新手 :) 所以我尝试了这样的事情: var queryable = uow.Repository().Query(); var model = queryable .FromSql(sql).Include(x => x.children);我又遇到了同样的错误:'无效的对象名称'TestModel'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-13
相关资源
最近更新 更多