【问题标题】:trying to add one entity, but also insert another entity to db试图添加一个实体,但也插入另一个实体到 db
【发布时间】:2016-12-11 09:08:06
【问题描述】:

我有三个实体:产品、项目(由一个产品和客户购买的产品数量组成)和因素如下:

public class Factor
{
    [Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public virtual int FactorId { get; set; }
    [Required]
    public virtual System.Guid TrackingCode { set; get; }
    [StringLength(1000)]
    public string StatusOfFactor { set; get; }
    [Required, DataType(DataType.EmailAddress), StringLength(200)]
    public string EmailOfFactor { set; get; }
    // price before discount
    public virtual double PriceOfFactor { set; get; }
    public virtual double DiscountOfFactor { set; get; }
    [StringLength(3000,MinimumLength =0)]
    public virtual string GeneralDescription { set; get; }
    public virtual List<Item> Items { set; get; }
}


public class Item
{
    //[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ItemId { set; get; }
    public int Count { set; get; }
    // 1 -> 1 relationship between product and Item
    public virtual Product Product { set; get; }
    // * -> * relationship between Item and Factor
    public virtual List<Factor> Factors { set; get; }
}


public class Product
{
    [Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public virtual int ProductId { set; get; }
    [Required]
    [StringLength(128)]
    public virtual string NameFa { set; get; }
    [Required]
    [Range(0, 990000000)]
    public virtual double Price { set; get; }
    // many->many relationship category and product
    public virtual List<Category> Categories { set; get; }
    //public virtual List<Factor> Factors { get; set; }
    public virtual Item Item { set; get; }
}

实体之间的关系如下: 1 -> 1 在 Product-Item 和 * -> * 在 Item-Factor

public class ProductConfig:EntityTypeConfiguration<Product>
{
    public ProductConfig() {
        // one to one relationship between product and item
        HasOptional(p => p.Item).WithRequired(i => i.Product);
    }
}

public class FactorConfig : EntityTypeConfiguration<Factor>
{
    public FactorConfig( ) {
       HasMany(p => p.Items)
      .WithMany(p => p.Factors)
      .Map(c => {
          c.ToTable("ItemsFactors");
          c.MapLeftKey("FactorID");
          c.MapRightKey("ItemID");
      });
    }
}

当我在数据库中插入一个因子时,另一个产品也会添加到产品表中!!! 这是向 db 插入因子的代码:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult RegisterFactor( [Bind(Include = "FactorId,TrackingCode,RegistrationDate,PaymentSucceed,PaymentIdOfBank,PaymentDate,StatusOfFactor,EmailOfFactor,TranmissionSucceed,TransmissionDate,PriceOfFactor,DiscountOfFactor,GeneralDescription,IsReturned,ReturnedDate,ReturnedDescription")]Factor factor )  
{  
    {
        // Session consist of Items and Items consist of Products
        List<Item> purchasedItems =
        (List<Item>)Session[Constants.SHOPPINGBAG];
        double totalPriceBeforeDiscount = 0.0d; 
        double totalDiscount = 0.0d;            
        double totalPriceAfterDiscount = 0.0; 
        //
        Guid trackingCode = Guid.NewGuid();
        factor.Items = new List<Item>();
        if ( purchasedItems == null )
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }
        foreach ( Item item in purchasedItems )
        {
            if ( item.Product != null )
            {
                factor.Items.Add(item);
            }
        }
        // allocate data to factor
        factor.PriceOfFactor = totalPriceBeforeDiscount;
        factor.DiscountOfFactor = totalDiscount;
        factor.PaymentDate = DateTime.Now;
        factor.RegistrationDate = DateTime.Now;
        factor.TrackingCode = trackingCode;
        if ( ModelState.IsValid )
        {
            //db.Factors.AsNoTracking();
            db.Products.AsNoTracking();
            db.Factors.Add(factor);
            db.SaveChanges();
            EmptyShoppingCart();
            return View("RegisterFactorSucceed", factor);
        }
        return View(factor);
    }
}

这真的很尴尬(对我来说)。为什么会这样?

【问题讨论】:

    标签: c# asp.net-mvc entity-framework code-first


    【解决方案1】:

    您的“ProductConfig”表示只要 Item 具有“product”,则应将其添加到 Product 表中。这是修改后的代码。

    ProductConfig 类

    public class ProductConfig : EntityTypeConfiguration<Product>
    {
        public ProductConfig()
        {
            // one to one relationship between product and item
            HasOptional(p => p.Item).WithOptionalDependent(i => i.Product);
        }
    }
    

    如果您将 Item.Product 更改为 null,则它不会添加到 Product 表中。

    foreach (Item item in purchasedItems)
            {
                if (item.Product != null)
                {
                    factor.Items.Add(item);
                    item.Product = null;//Setting Product to null
                }
            }
    

    【讨论】:

    • 非常感谢您的回复。产品类别取决于项目类别。即每个项目必须有一个或多个产品,但对于产品来说并非如此。我的商品和产品之间的关系是否正确?
    【解决方案2】:

    问题很可能是您的 Factor 对象引用了您要传回 EF 的内存中的产品。因此,EF 将其解释为新产品并将其与因子一起添加。

    你需要……

    1. 不要将填充的产品与您添加的因素一起传递到内存中,并使用 Id 链接它
    2. 确保在保存之前从数据库中加载要附加因子的现有产品并进行跟踪。

    我认为https://msdn.microsoft.com/en-gb/magazine/dn166926.aspx 可能会有所帮助。

    【讨论】:

    • 亲爱的 grrrrrrrrrrrrr,感谢您的好评。我认为这是由您发送的第一张便条引起的。但是我应该如何删除内存中的填充产品?
    • 您需要考虑使用 Ids 来引用 EF 中的其他实体。他们大大简化了情况。我想msdn.microsoft.com/en-gb/magazine/dn166926.aspx会解释更多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多