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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了首先使用EF6代码在多个表中添加记录相关的知识,希望对你有一定的参考价值。

我使用EF6代码第一种方法,我有3个表:

  1. 产品
  2. PromotionalOffers
  3. PromotionalOfferProduct

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

这是我的实体

产品

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

PromotionalOffer

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

第3个表由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,而不是在促销优惠中添加产品。

以上是关于首先使用EF6代码在多个表中添加记录的主要内容,如果未能解决你的问题,请参考以下文章

EF6:代码优先复杂类型

在 EF6 中执行复杂的原始 SQL 查询

EF6 自定义迁移表名

EF6(代码优先)单个外键属性上的多个导航属性

EF 6 数据库优先:如何更新存储过程?

如何首先在 EF6 代码中设置唯一的属性 [重复]