嗨我有一个叫做产品的表......列
product_id (p.K)
product_name
product_description
product_price
category_id (F.k)
我有另一个表类别
category_id (p.k)
category_name
我试过的是我试图用category_id更新产品表得到了问题 我有以下代码......
Private void btnsave_click(object sender , eventargs e)
{
if (datagridview1.SelectedRows.Count > 0)
{
int updateproductid = Convert.ToInt32(datagridview1.SelectedRows[0].Cells[0].Value);
string productcategories =cbCategorytypes.Text;
var categorytypes = (from producttype in dbcontext.categories
where producttype.name.Equals(productcategories)
select producttype.categoryId).SingleOrDefault();
product product1 = new product() { productId = updateproductid };
dbcontext.products.Attach(product1);
product1.Name = txtProductname.Text;
product1.Description = txtProductdescription.Text;
product1.Price = Convert.ToDecimal(txtProductPrice.Text);
product1.categoryId = categorytypes;
dbcontext.SaveChanges();
}
}
出错: 无效操作异常未处理:ObjectStateManager中已存在具有相同键的对象。 ObjectStateManager无法使用相同的键跟踪多个对象。
任何人都可以帮忙......
非常感谢....
答案 0 :(得分:3)
您收到错误,因为您尝试更新的产品已由实体框架加载。您正在创建product
的新实例并指定现有的product id
。
您可以使用dbcontext.products
DbSet的Local属性来检索现有产品。
int updateproductid = Convert.ToInt32(datagridview1.SelectedRows[0].Cells[0].Value);
string productcategories =cbCategorytypes.Text;
var categorytypes = (from producttype in dbcontext.categories
where producttype.name.Equals(productcategories)
select producttype.categoryId).SingleOrDefault();
product product1 = dbcontext.products.Local.Where(p => p.productId == updateproductid).First();
product1.Name = txtProductname.Text;
product1.Description = txtProductdescription.Text;
product1.Price = Convert.ToDecimal(txtProductPrice.Text);
product1.categoryId = categorytypes;
dbcontext.SaveChanges();
您应该考虑使用正确的命名约定
答案 1 :(得分:1)
这一行
product product1 = new product() { productId = updateproductid };
dbcontext.products.Attach(product1);
告诉我您正在创建一个新产品并将其附加到上下文中。但这个产品已经存在。您应该根据updateproductid
检索产品并设置新的categoryId
或您想要更改的属性。
更确切地说,你应该替换
product product1 = new product() { productId = updateproductid };
dbcontext.products.Attach(product1);
有这样的东西
product product1 = (from product in dbcontext.products
where productId == updateproductid select product);