C# Linq到SQL ForeignKeyReferenceAlreadyHasValueException
我看了几个线程,但我没有看到适合我的目的的解决方案 (至少我不明白如何着手实施它) 我有一个WCF服务,它使用Linq to SQL来检索、更新和删除我的SQL Server上的对象 我创建了一个简单的关系数据库,它具有 客户与订单之间的1对多关系, 订单和订单详细信息之间的1对多关系 现在,我的订单有一个用于CustomerID的外键,OrderDetails有一个用于订单ID的外键kwy 但是,OrderDetails在Products表中还包含ProductID的FK 基本上我现在要做的是使用OrderID修改OrderDetails,并使用ProductID添加另一个产品 尽管我一直收到ForeignKeyReferenceAlreadyHasValueException,但我对此有问题 我写了这篇文章,我知道这是完全错误的,但当时我不知道(我对SQL、Linq对SQL等完全陌生)我不能这么做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 基本上我现在要做的是
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,但你可能需要。没问题。很高兴能帮上忙。