【问题标题】:Entity Framework Code-First Eager Load parent child - children always emptyEntity Framework Code-First Eager Load parent child - children 始终为空
【发布时间】:2016-03-16 15:06:32
【问题描述】:

这是我的第一个代码优先项目,我记得在 db-first 中执行此操作从未遇到过问题。所以,我要么遗漏了一些明显的东西,要么遗漏了某处的规则。我不想使用延迟加载,并且考虑到许多使用急切加载的示例,我不得不认为它不需要这样做。

非常简单。父记录是Listing,子记录是Bid实体:

public class Listing {
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ListingID { get; set; }

    [Required]
    [StringLength(140)]
    public string Title { get; set; }

    //...etc.

    public List<Bid> Bids { get; set; }

    public Listing() {
        Bids = new List<Bid>();
    }
}

public class Bid {
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int BidID { get; set; }

    [Required]
    public decimal Amount { get; set; }

    //...etc.

    public int ListingID { get; set; }

    [ForeignKey("ListingID")]
    public Listing Listing { get; set; }

    public Bid() {
        Listing = new Listing();
    }
}

我正在使用 Include 来拉取子记录:

        using (var db = new MyDbContext()) {
            var listing = db.Listings
                .Where(x => x.Active == true && x.UserID == "abc123")
                .Include(x => x.Bids)
                .FirstOrDefault();
        }

子集合存在但始终为空(计数 = 0) - 它没有提取记录。他们肯定在桌子上。我可以手动查询并获取那些投标记录,没问题。基本上,我需要一个列表及其所有出价,类似于:

select l.*, b.*
from Listing l
inner join Bid b on l.ListingID = b.ListingID
where l.Active = 1
and l.UserID = 'abc123'

缺少什么?这篇文章说我做得对:

https://msdn.microsoft.com/en-us/data/jj574232.aspx

【问题讨论】:

  • 我一直在这个场景中使用虚拟集合;所以在我的Listing 课堂上我会有public virtual ICollection&lt;Bid&gt; Bids { get; set; }。我不知道这是否是导致您的问题的原因。也可能是映射问题。
  • 在此处查看 Gert 的答案:stackoverflow.com/questions/20757594/…
  • @drneel - 谢谢,但不想为此使用延迟加载。
  • @SteveGreene - 也就是说,做不到?我如何在我的模型中定义外键关系,首先在代码中,而不在构造函数中分配集合?我正在搜索旧代码以查看我以前可能做过的示例......似乎很难相信。

标签: c# .net entity-framework ef-code-first


【解决方案1】:

想通了。我知道我以前做过这种关系。我发现了一个较旧的项目,在那里我做了完全相同的事情。我所要做的就是删除 Bid 类中的构造函数。如果您指定关系的双方,显然会出错?我不知道......但现在它可以工作并且它正在拉动预期的记录。令人沮丧!似乎他们可以添加一些验证来帮助您轻松地射击自己。如果它无效,最好能确定。

一切都和 OP 一样,除了这个类:

public class Bid {
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int BidID { get; set; }

    [Required]
    public decimal Amount { get; set; }

    //...etc.

    public int ListingID { get; set; }

    [ForeignKey("ListingID")]
    public Listing Listing { get; set; }

    //public Bid() {
    //    Listing = new Listing();
    //}
}

【讨论】:

  • @SteveGreen 让您走上正轨,但您似乎没有接受提示。
  • @GertArnold 猜不出来。无论如何都要找到解决方案。无论如何,谢谢。
【解决方案2】:

尝试删除这两个类的构造函数。

【讨论】:

  • 谢谢,但不想为此使用延迟加载。
  • 我什至没有要求延迟加载。默认情况下它是启用的,你禁用它并尝试
  • 在 DbContext 类中禁用延迟加载,它没有改变任何东西。仍在加载一个空集合。
  • 是的,这不起作用。感谢您的努力,但从我读过的所有内容来看,在属性上使用“虚拟”纯粹与延迟加载相关联。即使在两个实体的属性上显式禁用延迟加载和虚拟化,也没有任何变化。出价计数仍然为零。
  • 试试看,把这两个类的构造函数都去掉。没必要
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-31
  • 1970-01-01
  • 2013-04-19
  • 2017-12-18
  • 2023-04-02
  • 1970-01-01
相关资源
最近更新 更多