проблема обновления linq с linq для enitites - PullRequest
1 голос
/ 03 сентября 2011

Привет, у меня есть таблица продуктов ... с колонками

             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 ]

3 голосов
/ 03 сентября 2011

Вы получаете ошибку, потому что продукт, который вы пытаетесь обновить, уже загружен платформой сущностей. Вы создаете новый экземпляр product и назначаете существующий product id.

Вы можете использовать Local свойства dbcontext.products DbSet для извлечения существующего продукта.

 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 голос
/ 03 сентября 2011

Эта строка

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);
...