与实体框架播种一对多的关系

时间:2013-11-24 22:44:10

标签: entity-framework ef-code-first

我已经看了很多关于与EF播出一对多关系的线索,但似乎无法找到似乎是一个简单问题的答案。怎么做?我有以下代码,我正在尝试创建AuctionItem实体,然后将AuctionImage实体添加到它。但是我在拍卖行上获得了一个nullOne.AuctionImages的例外.Auction.AuctionImages.Add()......谁能告诉我我做错了什么?谢谢!

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 个答案:

答案 0 :(得分:1)

在使用AuctionImages引用Add之前,您尚未为 var auctionOne = new AuctionItem() { AuctionComplete = string.Empty, AuctionDate = DateTime.Now.AddDays(-1), // ... AuctionImages = new List<AuctionImage> { new AuctionImage { Description="", Filename="" }, new AuctionImage { Description="", Filename="" } } }; 分配集合,这就是您获得null异常的原因。 (首次创建对象时,属性将具有空值)。

对于播种,通常最简单的做法是:

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

如果您想将其作为两个单独的步骤执行,只需将AuctionImages属性分配为新的List&lt;&gt; (或其他ICollection)在添加之前:

{{1}}
相关问题