Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq到SQL ForeignKeyReferenceAlreadyHasValueException_C#_Sql_Sql Server 2008_Linq To Sql - Fatal编程技术网

C# Linq到SQL ForeignKeyReferenceAlreadyHasValueException

C# Linq到SQL ForeignKeyReferenceAlreadyHasValueException,c#,sql,sql-server-2008,linq-to-sql,C#,Sql,Sql Server 2008,Linq To Sql,我看了几个线程,但我没有看到适合我的目的的解决方案 (至少我不明白如何着手实施它) 我有一个WCF服务,它使用Linq to SQL来检索、更新和删除我的SQL Server上的对象 我创建了一个简单的关系数据库,它具有 客户与订单之间的1对多关系, 订单和订单详细信息之间的1对多关系 现在,我的订单有一个用于CustomerID的外键,OrderDetails有一个用于订单ID的外键kwy 但是,OrderDetails在Products表中还包含ProductID的FK 基本上我现在要做的是

我看了几个线程,但我没有看到适合我的目的的解决方案 (至少我不明白如何着手实施它)

我有一个WCF服务,它使用Linq to SQL来检索、更新和删除我的SQL Server上的对象

我创建了一个简单的关系数据库,它具有 客户与订单之间的1对多关系, 订单和订单详细信息之间的1对多关系

现在,我的订单有一个用于CustomerID的外键,OrderDetails有一个用于订单ID的外键kwy

但是,OrderDetails在Products表中还包含ProductID的FK

基本上我现在要做的是使用OrderID修改OrderDetails,并使用ProductID添加另一个产品

尽管我一直收到ForeignKeyReferenceAlreadyHasValueException,但我对此有问题

我写了这篇文章,我知道这是完全错误的,但当时我不知道(我对SQL、Linq对SQL等完全陌生)我不能这么做

            OrderDetail item = new OrderDetail();                
            item.OrderID = orderItem.OrderID;
            item.ProductID = orderItem.ProductID;
            item.ProductQuantity = orderItem.ProductQuantity;                              
            jacksDB.OrderDetails.InsertOnSubmit(item);
            jacksDB.SubmitChanges();
我读到,我必须使用一行公共代码(如下面的代码)沿着这些线绘制实体或其他东西

            var order = jacksDB.Orders.Single(o => o.OrderID == orderItem.OrderID);
            var orderDetail = order.OrderDetails.Single(o => o.OrderID ==    orderItem.OrderID);
            orderDetail.ProductID = orderItem.ProductID;
            orderDetail.ProductQuantity = orderItem.ProductQuantity;
            orderDetail.Discount = orderItem.Discount;
            jacksDB.OrderDetails.InsertOnSubmit(orderDetail);
            jacksDB.SubmitChanges();
是否有人可以展示一下,如果不是太多的话,请解释一下我如何使用现有的OrderID(FK)将新的OrderDetail记录插入到我的OrderDetails表中,以便“编辑并向现有订单添加/删除产品”

提前谢谢你的帮助


John

好的,您得到了这个错误

ForeignKeyReferenceAlreadyHasValueException

链接上说了这件事

表示在实体已加载时尝试更改外键时发生的错误

我认为您需要做的是加载您正在谈论的订单,它将有一个与之相关联的订单详细信息列表。如果要删除其中一个引用,则需要从OrderDetails列表中删除OrderDetail

我想你需要做点像这样的事

using (DataClasses1DataContext context = new DataClasses1DataContext())
{
    Customer customer = context.Customers.Where(x => x.CustomerID == 1).Single();
    Order order = new Order();
    // set some order fields here
    customer.Orders.Add(order);

    OrderDetail orderDetail = new OrderDetail();
    order.OrderDetails.Add(orderDetail);

    orderDetail.Product = context.Products.Where(x => x.ProductID == 2).Single();
    orderDetail.ProductID = orderDetail.Product.ProductID;

    context.SubmitChanges();
}
在不使用InsertOnSubmit的情况下尝试,但仍保留提交的更改。我建议,因为您已经通过设置此项添加了记录

order.OrderDetails.Add(orderDetail);

因此,您可能不需要再次插入它。

也许您可以发布创建表所需的SQL,包括主键和外键?谢谢peter,我试图实现的是添加一个新的OrderDetails记录,其中包含一个现有的OrderID,例如OrderID=7;当我用5种产品创建订单时,我想在已经创建的订单中添加第6种产品。您是否尝试查看订单记录?它是否具有OrderDetails属性,即项目列表。将OrderDetails添加到其中。OrderDetail和Product是否具有一对一的关系?您还需要为产品设置OrderDetails.Product记录。我只是顺其自然,哈哈。这应该是我现在的建议,我不确定你是否需要设置ProductID和Product,但你可能需要。没问题。很高兴能帮上忙。