【问题标题】:How can I get the one to many relationship's many entity in nested response?如何在嵌套响应中获得一对多关系的多个实体?
【发布时间】:2018-12-16 17:08:50
【问题描述】:

我有一堂电影课

public class Movie
    {

        public int Id { get; set; }
        public string Name { get; set; }
        public Producer ProducerName { get; set; }
    }

还有一个类Producer

public class Producer
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public ICollection<Movie> Movies { get; set; }
    }

他们从制片人到电影是一对多的关系,即制片人可以有多部电影,而一部电影只有一个制片人。

我正在通过以下查询获取电影详细信息。

var result = _context.Movies
                    .Include(m => m.ProducerName)
                    .ToList();

我低于 Json:

{
        "id": 1,
        "name": "Venom",
        "producerName": {
            "id": 2,
            "name": "Amy Pascal",
            "movies": [
                {
                    "id": 1,
                    "name": "Venom"
                }
            ]
        }
    }

我想要在同一个查询中与制片人关联的所有电影?

喜欢

{
            "id": 1,
            "name": "Venom",
            "producerName": {
                "id": 2,
                "name": "Amy Pascal",
                "movies": [
                    {
                        "id": 1,
                        "name": "Venom"
                    },
                    {
                        "id": 56,
                        "name": "something"
                    },
                    {
                        "id": 81,
                        "name": "else"
                    }
                ]
            }
        }

我该怎么做?

编辑:使用其中一个答案中的查询,我只收到制片人的一部电影(当前电影),而不是全部。 我查看了数据库,发现即使从制片人到电影是一对多的关系,也为同一个制片人插入了多行(具有不同的主键)。我的问题在这里有点不同。我正在使用 json 播种数据库。 IDs(PK) 是数据库生成的。

用于为数据库播种的 JSON:

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

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

【问题讨论】:

  • 您是否想要制作人在每部电影下的完整电影列表?为此,您需要从制片人 Id 再次调用电影。您也许可以将其添加为子 Include 或 Select 但我尚未检查。
  • var result = _context.Producers.Include(p =&gt; p.Movies).ToList();
  • 没有。我想获取电影列表,包括电影的制片人,并在同一个调用中获取“制片人制作的所有电影”。我们在多对多的关系中得到了这一点。但这是一对多的关系。获得嵌套调用有点混乱。
  • 你让我感兴趣,尝试一下 :)

标签: c# entity-framework entity-framework-core


【解决方案1】:

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

更新:

正如@Gert Arnold 在投影(不返回您的实体)时指出的那样,EF Core 的Includes are ignored 因此,如果我选择投影到其他东西中,您可以删除Includes

所以:

// 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();

【讨论】:

  • IncludeThenInclude 在这里没有任何作用。您可以删除它们。
  • 怎么样?我刚刚对此进行了测试,并确定它可以工作,这正是 OP 想要的。可能不是最有效的查询,但这不是这里的问题,至少是 IMO。
  • 我没有说它不起作用,但预测不需要包含,甚至从查询中删除它们。见ignored includes
  • 啊忘记了,你是对的。我已经看到它上周产生的警告,很有趣。感谢您指出。 :)
  • 感谢您的回答。 Include 查询只返回制片人的当前电影。我查看了数据库,发现即使从制片人到电影是一对多的关系,也为同一个制片人插入了多行(具有不同的主键)。我的问题在这里有点不同。我正在使用 json 播种数据库。 IDs(PK) 是数据库生成的。如何约束 EF Core 不为同一个生产者创建重复的行,而不是为同一个生产者生成不同的密钥?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-12
  • 2017-06-22
  • 2019-04-07
  • 1970-01-01
相关资源
最近更新 更多