更新产品的类别id,而不是创建新的id

本文关键字:id 创建 更新 新产品 | 更新日期: 2023-09-27 18:06:37

我有两个表

产品

                product_id
                product_Name
                product_Price
                product_Description
                product_image
                category_id

另一个表

                 category
                 category_id
                 category_name
                 category_description

我有一个表单有三个文本框(说tbProductPrice,tbProductName,tbProductdescription)一个组合框(cbcategorytypes)两个按钮一个编辑,另一个是保存按钮。我正在尝试与category_id

一起更新产品表

当我点击编辑按钮时,类别名称被加载到组合框

当我们点击保存按钮时,文本框中的任何值都将在产品表中与类别一起更新,为此我编写了以下代码…

              using (var vareditcontext = new abcEntities())
            {
                pictureBox1.Enabled = true;
                pictureBox1.Visible = true;
                Image image = pictureBox1.Image;
                byte[] bit = null;
                bit = imageToByteArray(image);
                product1 pd = vareditcontext.product1.Where(p => p.product_Id == productid
                                     && p.category_Id == productcategoryid).First();

                string category = cbcategorytypes.Text;
                var c = new category { category_Name = category }; //problem at this line 
                pd.category = c;
                pd.product_Name = tbProductName.Text;
                decimal price = Convert.ToDecimal(tbProductPrice.Text);
                pd.product_Price = price;
                pd.product_Description = tbProductdescription.Text;
                pd.product_Image = bit;
                vareditcontext.SaveChanges();                 
                this.Close();
            }

当我点击保存按钮时,我得到了一个像这样的异常。

参数超出范围异常 ..

我得到这个错误,因为当我编辑并试图保存与类别名称的产品详细信息,新的类别名称将存储在数据库.....而不是更新当前的…

我怎样才能解决这个问题…我的意思是不存储新项目,我想将已经存在的类别设置为产品…

是否可以使用linq ....

有谁能帮帮我吗?

多谢…

更新产品的类别id,而不是创建新的id

我假设category_id是您的category实体的Key属性。如果您只将category_name加载到组合框中,则实际上需要从数据库中加载Category,因为EF在将类别分配给产品时必须知道键值:

product1 pd = vareditcontext.product1
    .Where(p => p.product_Id == productid
        && p.category_Id == productcategoryid)
    .First();
category c = vareditcontext.categories
    .Where(cat => cat.category_name == cbcategorytypes.Text)
    .First(); // let's hope the name is unique to pick not the wrong one
pd.category = c;
// ...
vareditcontext.SaveChanges();

你也可以只加载category_id,然后利用Dennis的方法来创建一个存根类别,并将其附加到上下文:

product1 pd = vareditcontext.product1
    .Where(p => p.product_Id == productid
        && p.category_Id == productcategoryid)
    .First();
int categoryid = vareditcontext.categories
    .Where(cat => cat.category_name == cbcategorytypes.Text)
    .Select(cat => cat.category_id)
    .First();
var c = new category { category_id = categoryid };
    // stub entity must have at least the key property set
vareditcontext.categories.Attach(c);
pd.category = c;
// ...
vareditcontext.SaveChanges();

如果您要将product表中的category_id列作为product模型类的外键属性公开,则只需设置category_id:

product1 pd = vareditcontext.product1
    .Where(p => p.product_Id == productid
        && p.category_Id == productcategoryid)
    .First();
int categoryid = vareditcontext.categories
    .Where(cat => cat.category_name == cbcategorytypes.Text)
    .Select(cat => cat.category_id)
    .First();
pd.category_id = categoryid;
// ...
vareditcontext.SaveChanges();

您需要从上下文中加载类别,或者将您动态创建的类别附加到上下文中。否则,EF假定您想要创建并存储一个新对象。

...
var c = new category { category_Name = category };
vareditcontext.Attach(c);
pd.category = c;
...

在MSDN,您可以阅读更多关于附加和分离对象的内容。