更新产品的类别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 ....
有谁能帮帮我吗?
多谢…
我假设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,您可以阅读更多关于附加和分离对象的内容。