實體框架核心多對多導航問題

.net-core asp.net-core c# entity-framework 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);

應該使用以下內容檢索photo變量:

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


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow