【发布时间】:2016-03-16 15:06:32
【问题描述】:
这是我的第一个代码优先项目,我记得在 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'
缺少什么?这篇文章说我做得对:
【问题讨论】:
-
我一直在这个场景中使用虚拟集合;所以在我的
Listing课堂上我会有public virtual ICollection<Bid> Bids { get; set; }。我不知道这是否是导致您的问题的原因。也可能是映射问题。 -
在此处查看 Gert 的答案:stackoverflow.com/questions/20757594/…
-
@drneel - 谢谢,但不想为此使用延迟加载。
-
@SteveGreene - 也就是说,做不到?我如何在我的模型中定义外键关系,首先在代码中,而不在构造函数中分配集合?我正在搜索旧代码以查看我以前可能做过的示例......似乎很难相信。
标签: c# .net entity-framework ef-code-first