实体框架:获取多个链接的对象

时间:2018-10-28 11:04:31

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

我已经研究了自己的问题,但不知何故。

我以1:n的方式有4个带有链接实体的类:

public class ContentProtectionProject
{
    [Required]
    public int Id { get; set; }

    ...

    [Required]
    public List<UrlToProtect> UrlsToProtect { get; set; }

    [Required]
    public int AccountId { get; set; }

    [ForeignKey("AccountId")]
    public Account Account { get; set; }
}

public class UrlToProtect
{
    [Required]
    public int Id { get; set; }

    ...

    [Required]
    public List<UrlTextContent> UrlsTextContent { get; set; }

    [Required]
    public int ContentProtectionProjectId { get; set; }

    [ForeignKey("ContentProtectionProjectId")]
    public ContentProtectionProject ContentProtectionProject { get; set; }
}

public class UrlTextContent
{
    [Required]
    public int Id { get; set; }

    ...

    [Required]
    public List<UrlTextSnippet> UrlTextSnippets { get; set; }

    [Required]
    public int UrlToProtectId { get; set; }

    [ForeignKey("UrlToProtectId")]
    public UrlToProtect UrlToProtect { get; set; }
}

public class UrlTextSnippet
{
    [Required]
    public int Id { get; set; }

    ...

    [Required]
    public int UrlTextContentId { get; set; }

    [ForeignKey("UrlTextContentId")]
    public UrlTextContent UrlTextContent { get; set; }
}

我想获取一个项目的所有数据,我试图通过projectId从存储库中获取这种数据:

public async Task<ContentProtectionProject> GetContentProtectionProject(int contentprotectionProjectId)
{
    var contentProtectionProject = await _context.ContentProtectionProjects
        .Include(x => x.UrlsToProtect)
        .ThenInclude(u => u.UrlsTextContent)

        .FirstOrDefaultAsync(x => x.Id == contentprotectionProjectId);

    return contentProtectionProject;
}

我只能进入“ UrlTextContent”级别,但不知何故不能包含“ UrlTextSnippet”。

我的目标是加载一个完整的“项目”,以便能够对链接的实体列表项进行一些处理。

最后,我想找到所有“ UrlTextContent”,这些“ UrlTextContent”在链接的实体上无法通过迭代获得“ UrlTextSnippets”。

我将.NET Core 2.1.403与Entity Framework Core .NET 2.1.4-rtm-31024一起使用

非常感谢您的帮助。

最诚挚的问候

编辑:

上下文类:

public class DataContext : DbContext
{
    public DataContext(DbContextOptions<DataContext> options) : base (options) {}
    ...
    public DbSet<ContentProtectionProject> ContentProtectionProjects { get; set; }
    public DbSet<UrlToProtect> UrlToProtects { get; set; }
    public DbSet<UrlTextContent> UrlTextContents { get; set; }
    public DbSet<UrlTextSnippet> UrlTextSnippets { get; set; }
}

编辑2:调试屏幕截图

“ UrlTextSnippet”列表为空,尽管有一个条目可用。

enter image description here

2 个答案:

答案 0 :(得分:1)

我讨厌那些说你可以做一些你做不到的事情的人,所以请提前对不起。根据{{​​3}},您应该可以链接那些Documentation.ThenInclude()。希望这些能让您走上正确的道路。

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

也有.Include(),但我会尽量避免选择。

此外,您可能会遇到此问题,并且也许可以这样做,但是IntelliSense可能会使您误入歧途。

  

注意:当前版本的Visual Studio提供不正确的代码完成   选项,并可能导致使用语法标记正确的表达式   集合导航后使用ThenInclude方法时出现错误   属性。这是在跟踪的IntelliSense错误的症状   this。可以忽略   这些伪造的语法错误,只要代码正确且可以   编译成功。

答案 1 :(得分:0)

坚持我的“莫名其妙”。昨天,我沮丧地关闭了Visual Studio,今天,我想再次对其进行测试,这里的现有代码就可以了,而无需进行任何更改。

也许我的Visual Studio代码昨天打ic了。

但是无论如何,谢谢您的帮助。