Entity Framework Code-First Eager Load parent child - children 总是空的

Entity Framework Code-First Eager Load parent child - children always empty

这是我的第一个代码优先项目,在 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

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

想通了。我知道我以前做过这种类型的关系。我找到了一个较旧的项目,我在其中做了完全相同的事情。我所要做的就是删除 Bid class 中的构造函数。显然,如果您指定关系的双方,它会出错吗?我不知道......但现在它起作用了,它正在拉动预期的记录。令人沮丧!似乎他们可以添加一些验证来帮助您轻松地搬起石头砸自己的脚。如果它无效,很高兴知道。

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

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();
    //}
}