在导航属性内使用导航属性

时间:2019-01-10 15:19:58

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

我有3个域模型PdModel,PdTable,PdColumn。表之间的关系非常简单-PdModel有许多PdTable,而PdTable有许多PdColumns。我需要填充IndexModel,以便我可以使用razor语法填充下拉菜单-例如,为模型选择下拉菜单,然后在特定模型的下一个下拉菜单级别为该模型表以及该表列再次填充。

我在这里找到了提示,但不起作用:Populating navigation properties of navigation properties

根据该网址,我的Index方法如下:

PdFolderTree =  _context.pdFolderTree.Include(x => x.pdModels)
                                                  .Include(x => x.pdModels.Select(y => y.PdTables))
                                                  .ToList();

我得到的错误是: InvalidOperationException:属性表达式'x => {从x.pdModels中的PdModel y选择[y] .PdTables}”无效。该表达式应表示属性访问:“ t => t.MyProperty”。有关包含相关数据的更多信息,请参见http://go.microsoft.com/fwlink/?LinkID=746393

我正在使用.NET Core razor-pages / MVC。

过去有人处理过类似的事情吗?

谢谢

public class PdModel
{ 
    [Key]
    public int Id { get; set; }
    public string ModelName { get; set; }

    public ICollection<PdTable> PdTables { get; set; } 

}

public class PdTable
{
    [Key]
    public int Id { get; set; }
    public int ModelId { get; set; }
    public string TableName { get; set; }

    [ForeignKey("ModelId")]
    public virtual PdModel PdModels { get; set; }

    public ICollection<PdColumn> PdColumns { get; set; }

} 

public class PdColumn
{
    [Key]
    public int Id { get; set; }
    public string ColumnName { get; set; }

    [ForeignKey("TableId")]
    public PdTable pdTable { get; set; }
}

1 个答案:

答案 0 :(得分:2)

我认为您需要使用.ThenInclude()

您链接到的Microsoft documentation给出了以下示例:

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

所以我认为您需要这样做:

PdFolderTree =  _context.pdFolderTree.Include(tree => tree.pdModels)
                              .ThenInclude(model => model.PdTables)
                              .ThenInclude(table => table.PdColumns)).ToList();

我还没有测试过,但是它应该为您提供pdFolderTree的列表,并且应该填充所有导航属性。