代码之家  ›  专栏  ›  技术社区  ›  Tsar Bomba

实体框架代码第一急加载父-子-子始终为空

  •  2
  • Tsar Bomba  · 技术社区  · 10 年前

    这是我的第一个代码优先项目,我记得在db优先中做这件事从来没有遇到过问题。所以,我要么错过了一些显而易见的东西,要么在某个地方错过了一条规则。我不想使用懒惰加载,并且考虑到许多使用急切加载的示例,我不得不认为不需要这样做。

    非常简单。父记录为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'
    

    缺了什么?这篇文章说我做得对:

    https://msdn.microsoft.com/en-us/data/jj574232.aspx

    2 回复  |  直到 10 年前
        1
  •  1
  •   Tsar Bomba    10 年前

    想出来了。我知道我以前有过这种关系。我发现了一个老项目,在那里我做了完全相同的事情。我所要做的就是删除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();
        //}
    }
    
        2
  •  0
  •   Nithila Shanmugananthan    10 年前

    尝试删除这两个类的构造函数。