Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 这是预期的实体框架7/核心行为还是一个bug?_Entity Framework_Entity Framework Core - Fatal编程技术网

Entity framework 这是预期的实体框架7/核心行为还是一个bug?

Entity framework 这是预期的实体框架7/核心行为还是一个bug?,entity-framework,entity-framework-core,Entity Framework,Entity Framework Core,为了这篇文章的目的,我有一个简单的模型 两个实体角色和人 public class Role : Entity { public Guid Id { get; set; } public string Name { get; set; } public virtual ICollection<Person> PeopleWithThisRole { get; set; } } public class Person : Entity { public

为了这篇文章的目的,我有一个简单的模型

两个实体角色和人

public class Role : Entity
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Person> PeopleWithThisRole { get; set; }
}

public class Person : Entity
{
    public Guid Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public Guid? RoleId { get; set; }
}
然后是
角色。拥有此角色的人员将完全由人员填充,而无需
。包括它

这是预期的行为还是我应该将其作为错误提出

谢谢

更新


多亏了下面的@hvd,我决定保持实体干净,不使用[JsonIgnore]属性,而是映射到DTO(不包括JSON中不需要的属性)——这可能是正确的方法

这是意料之中的事,也是早期版本EF的工作原理


您的
\u上下文
跟踪该上下文中加载的实体,以便保存更改。在该上下文中,
Person
对象已加载(应您的请求),并且它们的
RoleId
值是已知的。在相同的上下文中,已经加载了具有相同
Id
值的
Role
对象(也应您的请求)。EF基于这些ID链接内存中的对象。如果您跟踪发送到服务器的SQL查询,您会发现除了您请求的查询之外,没有其他查询被发送。

谢谢,我现在知道了。我已经检查了SQL,您是正确的,它没有加入。当我从Web API以JSON的形式返回时,问题就出现了,在Web API中,我返回的数据比我需要的要多。我可以在返回之前映射到DTO或清除集合,但您似乎无法控制:-(@MarkChidlow您可能希望简单地从序列化中排除属性。如何做取决于您的序列化程序,但在JSON.NET中,只需添加
[JsonIgnore]
属性。(如果您有时确实想序列化属性,那么这仍然是可能的,但它会变得更加棘手。)谢谢@hvd-您提供了极大的帮助。
  var roles = _context.Roles.ToList();
  var people = _context.People.ToList();