Entity Framework Core 尚未实现多对多关系,如 GitHub 问题中所述#1368;但是,当我按照该问题中的导航示例或类似的答案在 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 });
}
我从其他例子中遗漏了什么?
事实上这并不是专门针对many-to-many
关系,但总体上缺乏延迟加载EF Core 中的支持。所以为了有Tag
属性填充后,它必须立即(或显式)加载。所有这些(在某种程度上)都在加载相关数据EF Core 文档的部分。如果你看一下包括多个级别部分,您将看到以下说明
您可以使用以下方式深入了解关系以包含多个级别的相关数据:ThenInclude
方法。以下示例加载所有博客、其相关帖子以及每个帖子的作者。
以及加载示例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);
the photo
应该使用如下方式检索变量:
var photo = _context.Photos
.Include(e => e.PhotoTags)
.ThenInclude(e => e.Tag)
.FirstOrDefault(e => e.Id == 1);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)