繁体   English   中英

首先使用EF6代码在多个表中添加记录

[英]Adding records in multiple table using EF6 code first

我正在使用EF6代码优先方法,我有3个表:

  1. 产品
  2. 促销优惠
  3. 促销商品

我已经在产品表中添加了很少的产品,现在我希望添加新的促销产品时,我应该能够将一些产品(超过1个)链接到professionalofferproducts,但在我的情况下,它会添加新产品

这是我的实体

产品

 public class Product 
        {
            [Key]
            public long ProductId { get; set; }
            [Required, StringLength(100)]
            public string Name { get; set; }
    }

促销优惠

public class PromotionalOffer
    {
        [Key]
        public long PromotionalOfferID { get; set; }
        [Required]
        [StringLength(100)]
        public string Name { get; set; }
        public virtual List<Product> Products { get; set; }
        public void Add()
        {
            db.PromotionalOffers.Add(this);
            db.SaveChanges();
        }
}

第三张表由EF基于PromotionalOffer类中的List<Product> products自动创建。

下面是我的客户代码:

IPromotionalOffer pOffer = Factory.Instance.Create<IPromotionalOffer>();
            Domain.Product p = new Domain.Product
            {
                ProductId = 1,
                Name = "Colgate",
            };
            pOffer.Name = "Holi";
            pOffer.Products.Add(p);
            pOffer.Add();

尽管这会在PromotionalOfferProducts中添加条目,但也会在Products表中创建条目(尽管不应在Product表中添加条目)。

问题在于您正在添加新产品,因为您创建了Product的新实例,而不是使用现有实例。

因此,要解决此问题,请使用实体框架加载产品,而不是实例化您自己的产品实例。

因此,在一般的entityframework术语中,如果您不使用依赖注入容器,则如下所示:

var loadedProduct = dbContext.Product.Find(yourProductId);
IPromotionalOffer pOffer = Factory.Instance.Create<IPromotionalOffer>();
            pOffer.Name = "Holi";
            pOffer.Products.Add(loadedProduct);
            pOffer.Add();

原因是,entityframework实际上并未直接使用您的实体类,entityframework继承自您的产品类,并使其自己的类可以添加更多属性以跟踪实体。 如果您自己创建一个新实例,则entityframework无法跟踪它,因此会假定它是新产品,而不是现有产品,因为它正在跟踪正在加载的现有产品。

更为理想的是,我认为您需要更改实体映射,以便可以从另一角度进行操作,从而从实体框架加载产品,然后向产品添加promotionalOffer,而不是将产品添加至促销产品。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM