每次創建新的PurchasedProduct
並將0123Å添加到該記錄時,在插入表時,該表總會創建一個新的相同的Product
並引用新的一個,而不是指現有的。創建新記錄導致在相關表中創建新記錄
..這意味着一個Purchase
可以有很多PurchasedProduct
,各代表一個購買Product
又有多少它購買(數量)。
這是相關的代碼:
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();
}
}
}
例子:
之前
我做什麼(+保存)
後(請注意,它創建一個新的Product
代替使用舊)
爲了獲得更好的維護性,因爲您使用的是Windows窗體,只需創建一個上下文實例作爲窗體的字段。這樣更好,而且不像您向我們展示的那樣容易出錯。 – CodeNotFound
這似乎正在發生,因爲'Product'實體被分離到您保存'PurchasedProduct'的環境中。嘗試先將其附加,然後將其用作「PurchasedProduct」實體的參考。 –