虚拟查询使递归EFCore 2属性加载

时间:2018-03-27 18:04:33

标签: c# loading ef-core-2.0

我试图让我的头发试图让我的递归EFCore物品装载他们所有的祖父母/孙子,我无法决定我是垃圾还是我在做什么工作没有按要求工作的功能。

链接有一个类别,它存在于其他类别的层次结构中(数据结构正常工作)

Link link = FP.Links.Include(a=>a.Transaction.Account.Home)
                    .Include(a=>a.Category)
                    .ThenInclude(b=>b.parent)
                    .AsEnumerable()
                    .Where(a=>a.TransId==_transId && 
                    a.Transaction.Account.Home==_authHome)
 .FirstOrDefault();

当我查看Link.Category.parent.parent时,它为null。它似乎总是加载上面的前几个级别,当我拉回一个类别超过2个父级的链接时,它最终会给我一个空值。

我尝试过各种各样的SO答案,这些答案引导我使用包含(感觉笨重)和最新的关于.AsEnumerable()的讨论。我尝试过FirstOrDefault()和SingleOrDefault()。

我已经达到了:在EFCore 2中加载还远未完成,并且“修复了”#39;是一件事。所以,我尝试添加:

List<Category> CL= FP.Categories.Where(a=>a.home==_authHome).ToList();

在上一个查询之前,它可以正常工作。

我有三个问题:

1)我是否正确地解释了这会强制我的DBContext已经加载了我需要的数据,所以当我重新查询时它有访问权限?

2)我是否对自己保持开放态度并不适用于某些测试无法告诉我的情况?

3)是否有任何不那么简单的方法来使同样的事情发挥作用? (我可能想要link.Category.parent.parent.parent。(n).parent都可以访问)

还有一个问题,就是知道SO的规则,我会用言辞来表达:

4)从调试/编码的角度来看,是否有任何需要这样做的世界????

类:

public class Link
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id {get; set;}
    [ForeignKey("Transaction")]
    public int TransId { get; set; }

    public DateTime effectiveDt { get; set; }
    public bool isRefund { get; set; }
    public int transactionRole { get; set; } 

    public int setBy { get; set; }

    public string transactionComment { get; set; }

    public virtual Transaction Transaction { get; set; }
    public virtual Category Category { get; set; }

}

public partial class Category
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id {get; set;}

    public string Name { get; set; }

    public int categoryType { get; set; } //0=Normal, 1=Savings, 2=Loan

    [JsonIgnore]
    public virtual Category parent { get; set; }
    [JsonIgnore]
    public virtual ICollection<Summary> summaries { get; set; }
    public virtual ICollection<Category> children { get; set; }

    [JsonIgnore]
    public virtual ICollection<Link> Link { get; set; }
    [JsonIgnore]
    public virtual ICollection<Budget> Budget { get; set; }

    [JsonIgnore]
    public virtual Home home { get; set; }

}

0 个答案:

没有答案