【发布时间】:2017-09-30 08:24:18
【问题描述】:
Entity Framework Core 尚未实现多对多关系,如 GitHub 问题 #1368 中所跟踪;但是,当我按照该问题中的导航示例或 Stack Overflow 上的 similar answers 进行操作时,我的枚举无法产生结果。
照片和标签之间存在多对多关系。
实现连接表后,示例显示我应该能够:
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 });
}
我从其他示例中遗漏了什么?
【问题讨论】:
-
也许尝试删除对 base.OnModelCreating 的调用?覆盖 OnModelCreating 时我从未打过电话
-
你试过包括
.Include(p => p.PhotoTags)吗? EF Core 没有延迟加载,因此您必须通过 include 或.Load()显式进行预先加载 -
@Tseng 如果你使用
PhotoTags.Select(p => p.Tags),EF 知道它必须包含 PhotoTags,这与延迟加载不同 -
@CamiloTerevinto:我知道它是在选择时执行的(因为它是一个投影),但不确定它是否在
SelectMany上执行 -
@Tseng
SelectMany是双Select语句的快捷方式,所以是的。我对Select和SelectMany有非常复杂的查询,而没有Include调用
标签: c# entity-framework asp.net-core .net-core entity-framework-core