我有两张桌子
产品
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 ....
对此有任何帮助..
非常感谢....答案 0 :(得分:1)
您需要从上下文加载类别,或者将您在动态创建的类别附加到上下文。否则EF假定您要创建并存储新的。
...
var c = new category { category_Name = category };
vareditcontext.Attach(c);
pd.category = c;
...
在MSDN上,您可以阅读有关Attaching and Detaching Objects。
的更多信息答案 1 :(得分:1)
我认为category_id
是Key
实体的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();