linq更新linq到实体的问题

时间:2011-09-03 06:31:35

标签: c# winforms linq linq-to-entities entity-framework-4.1

嗨我有一个叫做产品的表......列

             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无法使用相同的键跟踪多个对象。

任何人都可以帮忙......

非常感谢....

2 个答案:

答案 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);