Каждый раз, когда я создаю новый PurchasedProduct
и ссылаюсь на него Product
, при вставке в таблицу таблица всегда создает новый идентичный Product
и ссылается на новый один, а не ссылаться на существующий.Создание новой записи, приводящей к созданию идентичной новой записи в связанной таблице
Итак, у меня есть эти 3 соответствующие таблицы:
..which означает, что 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)
{
}
}
}
И это главная форма, вставить новую запись в таблицу после получения DialogResult() == DialogResult.OK
сверху Form
.
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 Forms, просто создайте один экземпляр вашего контекста как поле вашей формы. Это лучше, а не склонность к ошибкам, как этот, который вы нам показываете. – CodeNotFound
Это, похоже, происходит потому, что сущность 'Product' отделяется от контекста, в котором вы сохраняете' PurchaseProduct'. Сначала попробуйте подключить его, а затем используйте его как ссылку на объект 'BuyasedProduct'. –