2016-02-08 286 views
1

每次創建新的PurchasedProduct並將0123Å添加到該記錄時,在插入表時,該表總會創建一個新的相同的Product並引用新的一個,而不是指現有的。創建新記錄導致在相關表中創建新記錄

所以,我有這3個相關表格: enter image description here

..這意味着一個Purchase可以有很多PurchasedProduct,各代表一個購買Product又有多少它購買(數量)。

這是WinForm的: enter image description here

這是相關的代碼:

public partial class fmAddEditPurchase : Form 
{ 
    List<Product> products; 
    Purchase purchase; 

    public fmAddEditPurchase() 
    { 
     InitializeComponent(); 
     Purchase = new Purchase(); 
     Text = "Add New Purchase"; 
     dtpDate.Value = DateTime.Now.Date; 

     RefreshPurchasedProduct(); 
     LoadProductList(); 
    } 

    private void RefreshPurchasedProduct() 
    { 
     List<PurchasedProduct> ppQuery = new List<PurchasedProduct>(); 
     BindingSource bi = new BindingSource(); 

     if (Purchase.PurchasedProducts.Count > 0) 
     { 
      using (var context = new dbKrunchworkContext()) 
      { 
       bi.DataSource = Purchase.PurchasedProducts. 
        Join(products, x => x.Product, y => y, (x, y) => 
          new { y.Product_Name, x.Price, x.Quantity }). 
          ToList(); 
      } 
     } 

     dgvPurchasedProduct.DataSource = bi; 
     dgvPurchasedProduct.Refresh(); 
    } 

    private void LoadProductList() 
    { 
     using (var context = new dbKrunchworkContext()) 
     { 
      products = context.Products.ToList(); 
     } 

     cbProductName.DataSource = products. 
      Select(x => x.Product_Name).ToList(); 
    } 

    private void btAddProduct_Click(object sender, EventArgs e) 
    { 
     decimal price = 0.0M; 

     if (decimal.TryParse(tbPrice.Text, out price) && price > 0) 
     { 
      PurchasedProduct temp = Purchase.PurchasedProducts. 
       FirstOrDefault(
        x => x.Product == 
        products[cbProductName.SelectedIndex] && 
        x.Price == price); 

      if (temp == null) 
      { 
       PurchasedProduct newPP = new PurchasedProduct(); 

       newPP.Product = products[cbProductName.SelectedIndex]; 
       newPP.Purchase = Purchase; 
       newPP.Quantity = (int)numQuantity.Value; 
       newPP.Price = price; 

       if (newPP.Product != null) 
       { 
        Purchase.PurchasedProducts.Add(newPP); 
       } 
      } 
      else 
      { 
       temp.Quantity += (int)numQuantity.Value; 
      } 

      RefreshPurchasedProduct(); 
     } 
    } 

    private void btSave_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      Purchase.Received_Date = dtpDate.Value; 
      Purchase.Total_Amount = decimal.Parse(tbTotalPrice.Text); 
      Purchase.Note = tbNote.Text; 

      using (var context = new dbKrunchworkContext()) 
      { 
       for (int i = 0; i < Purchase.PurchasedProducts.Count; i++) 
       { 
        PurchasedProduct pp = 
         Purchase.PurchasedProducts.ElementAt(i); 

        Product p = context.Products. 
         FirstOrDefault(x => x.ID == pp.Product.ID); 

        pp.Product = p; 
       } 
      } 
     } 
     catch (Exception) 
     {     

     } 
    } 
} 

這是從上方Form接收DialogResult() == DialogResult.OK後插入新的記錄表中​​的主要形式。

private void Purchase_AddNewRecord() 
    { 
     fmAddEditPurchase addForm = new fmAddEditPurchase(); 

     if (addForm.ShowDialog() == 
      DialogResult.OK && addForm.Purchase.Total_Amount > 0) 
     { 
      using (var context = new dbKrunchworkContext()) 
      { 
       context.Purchases.Add(addForm.Purchase); 
       context.SaveChanges(); 
      } 
     } 
    } 

例子:

之前

enter image description here

我做什麼(+保存)

enter image description here

後(請注意,它創建一個新的Product代替使用舊)

enter image description here

+0

爲了獲得更好的維護性,因爲您使用的是Windows窗體,只需創建一個上下文實例作爲窗體的字段。這樣更好,而且不像您向我們展示的那樣容易出錯。 – CodeNotFound

+0

這似乎正在發生,因爲'Product'實體被分離到您保存'PurchasedProduct'的環境中。嘗試先將其附加,然後將其用作「PurchasedProduct」實體的參考。 –

回答

1

的你在你的窗體的多個方法使用DbContext的多個實例。

您有此問題,因爲下面的代碼會將所有對象都帶入Purshase圖並將它們全部標記爲Added狀態。

private void Purchase_AddNewRecord() 
{ 
    fmAddEditPurchase addForm = new fmAddEditPurchase(); 

    if (addForm.ShowDialog() == 
     DialogResult.OK && addForm.Purchase.Total_Amount > 0) 
    { 
     using (var context = new dbKrunchworkContext()) 
     { 
      context.Purchases.Add(addForm.Purchase); 
      context.SaveChanges(); 
     } 
    } 
} 

爲了解決這個問題,必須更改相關Purshase例如像follwoing代碼每Product實例的狀態:

private void Purchase_AddNewRecord() 
{ 
    fmAddEditPurchase addForm = new fmAddEditPurchase(); 

    if (addForm.ShowDialog() == 
     DialogResult.OK && addForm.Purchase.Total_Amount > 0) 
    { 
     using (var context = new dbKrunchworkContext()) 
     { 
      context.Purchases.Add(addForm.Purchase); 
      foreach (var purchasedProduct in addForm.Purchase.PurchasedProducts) 
      { 
       context.Entry(purchasedProduct.Product).State = EntityState.Unchanged; 
      } 
      context.SaveChanges(); 
     } 
    } 
} 

不建議,如果你使用的是Windows窗體或WPF,以創建一個新的DbContext實例到您實際做的每種方法中。您必須爲每個表單創建一個字段。

+0

嗨,謝謝你的回答。順便說一句,你可以進一步解釋一下'context.Entry(purchasedProduct.Product).State = EntityState.Unchanged;'?由於我不知道代碼如何工作。謝謝。 –

相關問題