当前位置: 首页 > 面试题库 >

Linq到SQL ForeignKeyReferenceAlreadyHasValueException

谢鸿
2023-03-14
问题内容

我看了几个线程,但没有找到适合我目的的解决方案(至少我不知道如何实现它)

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

我创建了一个简单的关系html" target="_blank">数据库,该数据库在“客户”和“订单”之间具有一对多的关系,在“订单”和“ OrderDetails”之间具有一对多的关系,

现在,“我的订单”中有一个CustomerID外键,而“ OrderDetails”中有“订单ID”外键。

但是,OrderDetails在“产品表”中还包含ProductID的FK。

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

我遇到了问题,尽管我不断收到ForeignKeyReferenceAlreadyHasValueException

我写的这个我完全知道是错误的,但是当时我还不知道(我对SQL,对SQL的Linq完全陌生)无法做到这一点。

            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/zh-
cn/library/system.data.linq.foreignkeyreferencealreadyhasvalueexception.aspx

ForeignKeyReferenceAlreadyHasValueException

链接说明了这一点,

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

我认为您需要做的是加载您正在谈论的Order,它将有与之关联的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);

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



 类似资料:
  • 大多数应用程序都是以数据为中心的,但大多数数据存储库都是关系数据库。 多年来,设计人员和开发人员基于对象模型设计了应用程序。 对象负责连接到数据访问组件 - 称为数据访问层(DAL)。 在这里我们要考虑三点: 应用程序中所需的所有数据都不存储在同一个源中。 源可以是关系数据库,某些业务对象,XML文件或Web服务。 访问内存中对象比从数据库或XML文件访问数据更简单,更便宜。 访问的数据不直接使用

  • $linq 是 .NET 库 LINQ 的 JavaScript 版,支持查询、条件查询、排序、distinct、分组、联合和排除查询等。 $linq 同时实现了一些来自 MoreLinq 中的方法,可与 jQuery 的集合和数组协作。 示例程序: var people = [{ Name: "Senthil Kumar"},     { Name: "Norton Stanley"},    

  • 语言集成查询 (LINQ) 是 Visual Studio 2008 和 .NET Framework 3.5 版中一项突破性的创新,它在对象领域和数据领域之间架起了一座桥梁。 传 统上,针对数据的查询都是以简单的字符串表示,而没有编译时类型检查或 IntelliSense 支持。此外,您还必须针对以下各种数据源学习不同的查询语言:SQL 数据库、XML 文档、各种 Web 服务等。LINQ 使查

  • 在.NET Framework 3.5中提供了LINQ 支持后,Linq的呼声一度很高,各种LINQ Provider更是满天飞。他能够将数据查询语句集成到编程语言中,以一种统一的方式操作各种数据源,减少数据访问的复杂性。而LINQ本身也提供了很 好的扩展性,使开发人员可以轻松地编写属于自己的LINQ Provider。 NHiberante Linq 1.0支持基于NHibernate Cont

  • Go-LINQ,一个用于Go语言的强大的语言集成查询(LINQ)库。 具有以下特性: 完全使用 Go 语言编写 多人同时使用时也安全 完全使用迭代器模式的惰性计算 支持 arrays, slices, maps, strings, channels 和 自定义的 collections 示例代码:

  • java-linq-examples 是 101 个 LINQ 示例的 Java 移植版本。Android 兼容 Java 1.7. 此外还有以下语言移植版本: Swift Clojure Dart