实体框架Code-First Eager Load父子项 - 子项始终为空

时间:2016-03-16 15:06:32

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

这是我的第一个代码优先项目,并且在db-first中从未遇到过这样的问题,我记得。所以,我要么错过了一些明显的东西,要么就是我错过了某个地方的规则。我不想使用延迟加载,并且必须认为不需要这样做,因为许多示例使用了预先加载。

很简单。父记录是列表,子记录是出价实体:

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

子集合存在,但始终为空(Count = 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

2 个答案:

答案 0 :(得分: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();
    //}
}

答案 1 :(得分:0)

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