Entity Framework Code-First Eager Load parent child - children 总是空的
Entity Framework Code-First Eager Load parent child - children always empty
这是我的第一个代码优先项目,在 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'
缺少什么?这篇文章说我做对了:
尝试删除两个 类 的构造函数。
想通了。我知道我以前做过这种类型的关系。我找到了一个较旧的项目,我在其中做了完全相同的事情。我所要做的就是删除 Bid class 中的构造函数。显然,如果您指定关系的双方,它会出错吗?我不知道......但现在它起作用了,它正在拉动预期的记录。令人沮丧!似乎他们可以添加一些验证来帮助您轻松地搬起石头砸自己的脚。如果它无效,很高兴知道。
一切都和 OP 一样,除了这个 class:
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();
//}
}
这是我的第一个代码优先项目,在 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'
缺少什么?这篇文章说我做对了:
尝试删除两个 类 的构造函数。
想通了。我知道我以前做过这种类型的关系。我找到了一个较旧的项目,我在其中做了完全相同的事情。我所要做的就是删除 Bid class 中的构造函数。显然,如果您指定关系的双方,它会出错吗?我不知道......但现在它起作用了,它正在拉动预期的记录。令人沮丧!似乎他们可以添加一些验证来帮助您轻松地搬起石头砸自己的脚。如果它无效,很高兴知道。
一切都和 OP 一样,除了这个 class:
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();
//}
}