我记得这是我的第一个代码优先项目,在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();
        }


子集合存在,但始终为空(计数= 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类中的构造函数。如果您指定关系的双方,显然会出错吗?我不知道...但是现在它可以工作了,并且正在提取预期的记录。令人沮丧!似乎他们可以添加一些验证,以帮助您轻松地射击自己的脚。如果无效,一定要知道。

除此类外,其他所有操作均与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();
    //}
}

关于c# - Entity Framework 优先优先加载父级子级-子级始终为空,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36039550/

10-13 08:24