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