这是我的第一个代码优先项目,并且在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'
缺少什么?这篇文章说我做得对:
答案 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)
尝试删除两个类的构造函数。