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
C# 如何在嵌套响应中获取一对多关系的多实体?_C#_Entity Framework_Entity Framework Core - Fatal编程技术网

C# 如何在嵌套响应中获取一对多关系的多实体?

C# 如何在嵌套响应中获取一对多关系的多实体?,c#,entity-framework,entity-framework-core,C#,Entity Framework,Entity Framework Core,我有一部班级电影 public class Movie { public int Id { get; set; } public string Name { get; set; } public Producer ProducerName { get; set; } } 还有一个班级制作人 public class Producer { public int Id { get; set; }

我有一部班级电影

public class Movie
    {

        public int Id { get; set; }
        public string Name { get; set; }
        public Producer ProducerName { get; set; }
    }
还有一个班级制作人

public class Producer
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public ICollection<Movie> Movies { get; set; }
    }
我得到以下信息:

{
        "id": 1,
        "name": "Venom",
        "producerName": {
            "id": 2,
            "name": "Amy Pascal",
            "movies": [
                {
                    "id": 1,
                    "name": "Venom"
                }
            ]
        }
    }
我想在同一个查询中查询与制片人关联的所有电影

我该怎么做

编辑:使用其中一个答案中的查询,我只收到该制作人的一部电影,而不是全部电影。 我查看了数据库,发现尽管制片人和电影之间是一对多的关系,但同一个制片人插入了多行,主键不同。我的问题在这里有点不同。我正在使用json对数据库进行种子设定。IDsPK是由数据库生成的

用于为数据库种子的JSON:

[   
  {
    "Name": "Venom",
    "ProducerName": 
          {
               "Name": "Steven Spielberg"
          }   
  },
  {
    "Name": "Kung Fu League",
    "ProducerName":
          {
               "Name": "Steven Spielberg"
          }  
  }
]

我如何约束EF Core不为同一制片人创建重复行,也不为同一制片人生成不同的密钥,这样我就可以成功接收单个制片人的所有电影

您可以链接包含。首先从电影开始,然后是制片人,最后使用包含制片人的电影

更新:

正如@Gert Arnold在投影时指出的,不返回实体,EF Core,因此,如果使用我的选项投影到其他对象,您可以删除包含

因此:


您是否希望在每部电影下为制片人提供完整的电影列表?你需要再打一个电话给电影制作人。您可以将其添加为子包含或选择,但我没有选中。var result=\u context.Producers.Includep=>p.Movies.ToList;不,我想获取电影列表,包括电影制片人,并获取制片人在同一通话中制作的所有电影。我们在多对多的关系中得到了这一点。但这是一对多的关系。获取嵌套调用有点混乱。您让我感兴趣,尝试了一些东西:Include和thenclude在这里没有任何效果。你可以移除它们,怎么会呢?我刚刚测试了这个,并且确信它是有效的,这正是OP想要的。可能不是最有效的查询,但这不是问题所在,至少在我看来是这样。我没有说它不起作用,但投影不需要包含它们,甚至不需要从查询中删除它们。看,啊,忘了,你说得对。我看到了它上周发出的警告,真有趣。谢谢你指出这一点谢谢你的回答。Include查询只返回制作人的当前电影。我查看了数据库,发现尽管制片人和电影之间是一对多的关系,但同一个制片人插入了多行,主键不同。我的问题在这里有点不同。我正在使用json对数据库进行种子设定。IDsPK是由数据库生成的。如何约束EF核心不为同一生产者创建重复行,也不为同一生产者生成不同的键?
{
            "id": 1,
            "name": "Venom",
            "producerName": {
                "id": 2,
                "name": "Amy Pascal",
                "movies": [
                    {
                        "id": 1,
                        "name": "Venom"
                    },
                    {
                        "id": 56,
                        "name": "something"
                    },
                    {
                        "id": 81,
                        "name": "else"
                    }
                ]
            }
        }
[   
  {
    "Name": "Venom",
    "ProducerName": 
          {
               "Name": "Steven Spielberg"
          }   
  },
  {
    "Name": "Kung Fu League",
    "ProducerName":
          {
               "Name": "Steven Spielberg"
          }  
  }
]
// use .Include and .ThenInclude when returning your entities
var returningEntities = context.Movies
                                 .Include(p => p.ProducerName)
                                 .ThenInclude(m => m.Movies).ToList();

// No need for Include when use projection
var returningAnonymousObject = context.Movies
    .Select(a => new
    {
        id = a.Id,
        name = a.Name,
        producer = new
        {
            id = a.ProducerName.Id,
            name = a.ProducerName.Name,
            movies = a.ProducerName.Movies.Select(m => new
            {
                id = m.Id,
                name = m.Name
            })
        }
    }).ToList();