c# – Linq to SQL ForeignKeyReferenceAlreadyHasValueException

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

我有一个使用Linq to sql的WCF服务,以便检索,更新和删除sql Server上的对象.

我创建了一个简单的Relational数据库,它有一个
客户与订单之间的一对多关系,
Order和OrderDetails之间的1对多关系,

现在我的订单有一个CustomerID的外键,而OrderDetails有一个外国的kwy订单ID.

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

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

虽然我一直收到ForeignKeyReferenceAlreadyHasValueException,但我遇到了问题

我已经写了这个,我知道这是完全错误的,但当时我不知道(我是sql的新手,Linq to 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表中以便“编辑和添加/删除产品现有订单“

在此先感谢您的帮助

约翰

解决方法

好的,所以你收到这个错误,

http://msdn.microsoft.com/en-us/library/system.data.linq.foreignkeyreferencealreadyhasvalueexception.aspx

ForeignKeyReferenceAlreadyHasValueException

链接说明了这一点,

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

我认为您需要做的是加载您正在讨论的订单,它将有一个与之关联的OrderDetails列表.如果要删除其中一个引用,则需要从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尝试它,但仍保留SubmitChanges.我建议,因为你已经通过设置这个来添加记录,

order.OrderDetails.Add(orderDetail);

所以你可能不需要再次插入它.

相关文章

目录简介使用JS互操作使用ClipLazor库创建项目使用方法简单测...
目录简介快速入门安装 NuGet 包实体类User数据库类DbFactory...
本文实现一个简单的配置类,原理比较简单,适用于一些小型项...
C#中Description特性主要用于枚举和属性,方法比较简单,记录...
[TOC] # 原理简介 本文参考[C#/WPF/WinForm/程序实现软件开机...
目录简介获取 HTML 文档解析 HTML 文档测试补充:使用 CSS 选...