gpt4 book ai didi

c# - Entity Framework Core 多对多导航问题

转载 作者:行者123 更新时间:2023-11-30 20:31:06 25 4
gpt4 key购买 nike

Entity Framework Core 尚未实现多对多关系,如 GitHub 问题 #1368 中所跟踪。 ;但是,当我按照该问题或 similar answers 中的导航示例进行操作时在 Stack Overflow 上,我的枚举未能产生结果。

照片和标签之间存在多对多关系。

实现连接表后,示例表明我应该能够:

var tags = photo.PhotoTags.Select(p => p.Tag);

虽然没有产生任何结果,但我可以通过以下方式加载:

var tags = _context.Photos
.Where(p => p.Id == 1)
.SelectMany(p => p.PhotoTags)
.Select(j => j.Tag)
.ToList();

相关代码:

public class Photo
{
public int Id { get; set; }
public virtual ICollection<PhotoTag> PhotoTags { get; set; }
}

public class Tag
{
public int Id { get; set; }
public virtual ICollection<PhotoTag> PhotoTags { get; set; }
}

public class PhotoTag
{
public int PhotoId { get; set; }
public Photo Photo { get; set; }

public int TagId { get; set; }
public Tag Tag { get; set; }
}

protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);

builder.Entity<PhotoTag>().HasKey(x => new { x.PhotoId, x.TagId });
}

我从其他示例中遗漏了什么?

最佳答案

事实上,这并不是特定于多对多关系,而是一般来说由于 EF Core 缺乏延迟加载支持。因此,为了填充 Tag 属性,必须立即(或显式)加载它。所有这些(在某种程度上)都在Loading Related Data中进行了解释。 EF Core 文档的部分。如果您查看包括多个级别部分,您将看到以下说明

You can drill down thru relationships to include multiple levels of related data using the ThenInclude method. The following example loads all blogs, their related posts, and the author of each post.

以及加载 Post.Author 的示例,它与您的几乎相同:

using (var context = new BloggingContext())
{
var blogs = context.Blogs
.Include(blog => blog.Posts)
.ThenInclude(post => post.Author)
.ToList();
}

所以为了让这个工作

var tags = photo.PhotoTags.Select(p => p.Tag);

应该使用如下方式检索 photo 变量:

var photo = _context.Photos
.Include(e => e.PhotoTags)
.ThenInclude(e => e.Tag)
.FirstOrDefault(e => e.Id == 1);

关于c# - Entity Framework Core 多对多导航问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43744206/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com