geoff swartz
geoff swartz

Reputation: 5965

seeding one to many relationship with entity framework

I've looked through quite a few threads about seeding a one to many relationship with EF but can't seem to find the answer to what seems like a simple question. How to do it? I have the following code where I'm trying to create an AuctionItem entity and then add AuctionImage entities to it. But I get a null exception for auctionOne.AuctionImages on the line auctionOne.AuctionImages.Add()... Can anyone tell me what I'm doing wrong? Thanks!

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);
        }

And here are my classes.

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; }
}

Upvotes: 0

Views: 965

Answers (1)

Myk Willis
Myk Willis

Reputation: 12869

You haven't allocated the collection for AuctionImages before you are referencing it with the Add, which is why you get the null exception. (When the object is first created, the property will have a null value).

For seeding, it's usually just easiest to do something like:

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

If you want to do it as two separate steps, just allocate the AuctionImages property as a new List<> (or other ICollection) before adding to it:

        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);

Upvotes: 1

Related Questions