使用 linq 从 C# 更新 sql 中的外键列

问题描述 投票:0回答:3

我正在使用 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();
}

问题是什么? 预先感谢您!

c# entity-framework linq
3个回答
0
投票

可能与这些有关 Linq to SQLForeignKeyReferenceAlreadyHasValueException如何更改关联字段的值

抱歉,我没有足够的声誉来撰写评论,这就是为什么将其发布为答案


0
投票

如果导航属性已加载与您尝试设置的新 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();
}

0
投票

即使应用此处提出的解决方案,我也有相同的错误代码“”,但它仍然抛出异常

抛出新的 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();
        }

    }
© www.soinside.com 2019 - 2024. All rights reserved.