2013-11-24 46 views
0

我已經看過很多關於播種與EF的一對多關係的線程,但似乎無法找到似乎是一個簡單問題的答案。怎麼做?我有以下代碼,我試圖創建一個AuctionItem實體,然後將AuctionImage實體添加到它。但是我在auctionOne.AuctionImages.Add()這行上得到了一個空的例外auctionOne.AuctionImages ...任何人都可以告訴我我做錯了什麼嗎?謝謝!播種與實體框架的一對多關係

protected override void Seed(AuctionDbContext db) 
     { 
      var auctionOne = new AuctionItem() 
      { 
       AuctionComplete = string.Empty, 
       AuctionDate = DateTime.Now.AddDays(-1), 
       CurrentPrice = 2, 
       EndPrice = 5, 
       InitialPrice = 1, 
       InitialQuantity = 1, 
       LongDescription = "Long description", 
       PriceDrops = 2, 
       QuantityRemaining = 2, 
       ReserveQuantity = 1, 
       RetailPrice = 4, 
       ShortDescription = "Short description", 
       Title = "Auction one"     
      }; 

      auctionOne.AuctionImages.Add(new AuctionImage 
      { 
       Description = "Beautiful picture", 
       Filename = "picture.jpg" 
      }); 

      db.AuctionItems.Add(auctionOne); 

      base.Seed(db); 
     } 

這裏是我的課程。

public class AuctionItem 
    { 
     [Key] 
     public int AuctionItemID { get; set; } 

     [Column(TypeName = "varchar"), MaxLength(256)] 
     public string Title { get; set; } 

     public decimal InitialPrice { get; set; } 

     public int InitialQuantity { get; set; } 

     public DateTime? AuctionDate { get; set; } 

     [Column(TypeName = "varchar(max)")] 
     public string ShortDescription { get; set; } 

     [Column(TypeName = "varchar(max)")] 
     public string LongDescription { get; set; } 
     public decimal RetailPrice { get; set; } 
     public decimal? EndPrice { get; set; } 
     public decimal CurrentPrice { get; set; } 
     public int PriceDrops { get; set; } 
     public int QuantityRemaining { get; set; } 
     public int ReserveQuantity { get; set; } 

     [Column(TypeName = "char"), MaxLength(10)] 
     public string AuctionComplete { get; set; } 

     [Column(TypeName = "xml")] 
     public string Metadata { get; set; } 

     public virtual ICollection<AuctionImage> AuctionImages { get; set; } 
    } 



public class AuctionImage 
{ 
    [Key] 
    public int AuctionImageID { get; set; } 

    [ForeignKey("AuctionItem")] 
    public int AuctionItemID { get; set; } 

    public virtual AuctionItem AuctionItem { get; set; } 

    [Column(TypeName = "varchar"), MaxLength(256)] 
    public string Description { get; set; } 

    [Column(TypeName = "varchar(max)")] 
    public string Filename { get; set; } 

    [Column(TypeName = "xml")] 
    public string MetaData { get; set; } 
} 

回答

1

你與Add,這就是爲什麼你會得到空引用異常之前,你還沒有分配的集合AuctionImages。 (首次創建對象時,該屬性將具有空值)。

播種,它通常只是最簡單的做一些事情,如:

 var auctionOne = new AuctionItem() 
     { 
      AuctionComplete = string.Empty, 
      AuctionDate = DateTime.Now.AddDays(-1), 
      // ... 
      AuctionImages = new List<AuctionImage> { 
       new AuctionImage { Description="", Filename="" }, 
       new AuctionImage { Description="", Filename="" } 
      }     
     }; 

如果你想這樣做,作爲兩個獨立的步驟,只是分配AuctionImages物業作爲一個新的列表<>(或其他的ICollection)在添加之前:

 var auctionOne = new AuctionItem() 
     { 
      // ... 
      Title = "Auction one"     
     }; 

     auctionOne.AuctionImages = new List<AuctionImage>(); // add this 
     auctionOne.AuctionImages.Add(new AuctionImage 
     { 
      Description = "Beautiful picture", 
      Filename = "picture.jpg" 
     }); 

     db.AuctionItems.Add(auctionOne); 
+0

好的,謝謝。這實際上是我最初考慮的事情,但認爲EF會自動爲我創建集合以向其添加項目。可能不會。謝謝! –