Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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
Linq to sql LINQ to SQL:在提交更改之前删除新添加的子实体-失败_Linq To Sql - Fatal编程技术网

Linq to sql LINQ to SQL:在提交更改之前删除新添加的子实体-失败

Linq to sql LINQ to SQL:在提交更改之前删除新添加的子实体-失败,linq-to-sql,Linq To Sql,我的父子关系与Northwind Customer/Orders非常相似,但有一点不同,Orders表中的CustomerID不能接受NULL,它是一个FK,子项有一列PKey,称为OrderID 我在windows窗体数据绑定中使用此模型,上面的区域在文本框中显示客户信息,下面的区域有一个列出订单的网格 我使用LINQ from DB检索客户,以允许用户编辑客户信息或订单详细信息,当我从订单网格中删除一行,然后提交更改时,我收到错误消息 试图删除客户和订单之间的关系,但是关系的外键之一(Cus

我的父子关系与Northwind Customer/Orders非常相似,但有一点不同,Orders表中的CustomerID不能接受NULL,它是一个FK,子项有一列PKey,称为OrderID

我在windows窗体数据绑定中使用此模型,上面的区域在文本框中显示客户信息,下面的区域有一个列出订单的网格

我使用LINQ from DB检索客户,以允许用户编辑客户信息或订单详细信息,当我从订单网格中删除一行,然后提交更改时,我收到错误消息 试图删除客户和订单之间的关系,但是关系的外键之一(CustomerID)不能设置为Null

在互联网上搜索了很长时间后,我使用了DeleteOnNull=True属性,它现在可以工作了

然而,当我向网格中添加一个新订单,然后在提交更改之前将其删除时,仍然会出现相同的错误

我知道,当我在网格中删除一个新订单行时,我只删除与客户的关联,因此它为该实体设置CustomerID=NULL,好吧,现在如何在提交更改之前将其从实体集中完全删除以避免错误,我不能使用DeleteOnSubmit,因为它是一个新实体,不是来自db,如果我尝试了,我会收到一个异常,因此使用网格手动删除行不起作用,我想这是调用“Remove”方法,并且我不能使用DeleteOnSubmit,我能做什么

为什么这么难?在ADO.NET datatable更容易,如果我删除一行,它恰好来自db,那么它会将其标记为删除,如果它是新行,那么它会将其从集合中删除,完成!在投入大量精力学习LINQtoSQL之后,我不想回到数据集

非常感谢您的帮助

多谢各位
巴萨姆

我发现了问题所在并解决了它。如果其他人有同样的问题,我想在这里分享信息

首先我想提到一个重要的事实:如果在数据库中启用了级联删除,那么

DeleteOnNull:=True , DeleteRule:="CASCADE"  
将自动插入.dbml文件后面的代码中,而无需为特定关联手动添加
DeleteOnNull=True

问题是,
OrderType
的子实体中有另一个
FKey
,即
OrderTypeID
。我将此值设置为:

Dim NormalOrderType = (From ot in db.OrderTypes Where ot.OrderTypeID=1 Select ot).Single
NewOrder.OrderType = NormalOrderType          
OrdersBindingSource.Add(NewOrder)       
当用户从网格中删除特定客户的订单时,LINQ to SQL会将CustomerID
FKey
设置为NOTHING,从而断开与父实体的关联。但是,它不会将
OrderTypeID
设置为NOTHING,从而使另一个关联保持活动状态,以创建
OrderTypes
实体。内存中已经加载了一个
OrderType
实体,LINQ to SQL会认为我仍然希望插入子实体,但是使用
CustomerID=Nothing
,并且由于这是不允许的(从dbml文件,
Nullable=False
),它会在尝试保存到DB之前引发异常

通过执行以下操作可以解决此问题:

NewOrder.OrderType = NOTHING
这将手动删除与其他
FKey
的关联。然后,当调用
submitChanges
时,简单地删除子实体将导致LINQ to SQL忽略它

谢谢你

Bassam Muhammad。

您能告诉我您使用的是WinForm应用程序还是Web应用程序吗?在Orders datagrid中添加或删除行时,无法理解您在做什么。虽然我相信作者提到他正在使用WinForms,但我在ASP.NET MVC中也遇到了同样的情况。我有一个场景,MVC默认模型绑定器正在创建一个子实体,我(基于某些条件)不希望该子实体持久化到数据库中。我不希望它真的存在,但它存在于我的对象图中。如果我使用“.Remove()”——例如Customer.Orders.RemoveAt(0)来使用作者的架构——那么在我提交更改之前,它似乎是正常的,在这一点上,我得到一个关于不能设置为null的外键的错误。。。。