我正在使用 Linq 用 C# 制作一个 Windows 窗体应用程序。我正在尝试更新外键列,但我不断收到以下错误:
“由于对象的当前状态,操作无效。”
错误消息框指向行:
throw new System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException();
我已经使用以下方法尝试更新:
//Updates a Product
public void UpdateProduct(int productID, string productName, int categoryID, int supplierID, bool priceType, decimal costPrice, decimal retailPrice, bool inStock)
{
Product product = (from p in db.Products
where p.ProductId == productID
select p).Single();
product.Name = productName;
product.CategoryId = categoryID;
product.SupplierId = supplierID;
product.PriceType = priceType;
product.CostPrice = costPrice;
product.RetailPrice = retailPrice;
product.Stock = inStock;
db.SubmitChanges();
}
问题是什么? 预先感谢您!
可能与这些有关 Linq to SQLForeignKeyReferenceAlreadyHasValueException 和 如何更改关联字段的值
抱歉,我没有足够的声誉来撰写评论,这就是为什么将其发布为答案
如果导航属性已加载与您尝试设置的新 ID 不匹配的值,则会发生错误。
不要设置 ID 值,而是尝试设置导航属性,如下所示:
public void UpdateProduct(int productID, string productName, int categoryID, int supplierID, bool priceType, decimal costPrice, decimal retailPrice, bool inStock)
{
Product product = (from p in db.Products
where p.ProductId == productID
select p).Single();
Category cat = (from c in db.Categories
where c.CategoryId == categoryID
select c).FirstOrDefault();
Supplier sup = (from s in db.Suppliers
where s.SupplierID == supplierID
select s).FirstOrDefault();
product.Name = productName;
product.Category = cat;
product.Supplier = sup;
product.PriceType = priceType;
product.CostPrice = costPrice;
product.RetailPrice = retailPrice;
product.Stock = inStock;
db.SubmitChanges();
}
即使应用此处提出的解决方案,我也有相同的错误代码“”,但它仍然抛出异常
抛出新的 System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException();
我的代码如下,我做错了什么或者我必须做什么来纠正这个错误?
public void actualizar(catUsuario objData)
{
ModelDatosDataContext db2 = new ModelDatosDataContext();
catRol cRol = (from roles in db2.catRol
where roles.idRol == objData.idRol
select roles).First();
catUsuario objActualiza = db.catUsuario.SingleOrDefault(u => u.userID == objData.userID);
if (objActualiza != null)
{
objActualiza.NomUser = objData.NomUser;
objActualiza.email = objData.email;
objActualiza.password = objData.password;
if (objActualiza.idRol != objData.idRol)
{
objActualiza.idRol = cRol.idRol;
}
db.SubmitChanges();
}
}