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

时间:2011-08-24 16:18:30

标签: c# .net linq entity-framework linq-to-entities

我有两张桌子

产品

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

对此有任何帮助..

非常感谢....

2 个答案:

答案 0 :(得分:1)

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

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

在MSDN上,您可以阅读有关Attaching and Detaching Objects

的更多信息

答案 1 :(得分:1)

我认为category_idKey实体的category属性。如果您只将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();

如果您将category_id表格中的product列作为外键属性公开到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();