我的父子关系与Northwind客户/订单非常相似,但有一个不同,Orders表中的CustomerID不能接受NULL,它是FK,孩子有一个名为OrderID的列PKey
我在Windows窗体数据绑定中使用此模型,上部区域在文本框中具有客户信息,下部区域具有列出订单的网格
我使用DBQ中的LINQ检索客户以允许用户编辑客户信息或订单详细信息,当我从订单网格中删除一行然后提交更改时,我收到错误 “尝试删除客户和订单之间的关系,但是,其中一个关系的外键(CustomerID)无法设置为Null”
在互联网上长时间搜索后,我使用了DeleteOnNull = True属性,现在可以使用了
什么不起作用但仍然给出相同的确切错误是当我向网格添加新订单然后在SubmitChanges
之前删除它据我所知,当我删除网格中的新订单行时,我只删除了与客户的关联,因此它为该实体设置了CustomerID = NULL,很好,现在如何在提交更改之前将其从实体集中完全删除为了避免错误,我不能使用DeleteOnSubmit,因为它是一个不是来自db的新实体,如果我尝试我将收到一个异常,所以使用网格手动删除行不起作用,这是调用“删除”方法我想,我不能使用DeleteOnSubmit,我该怎么办?
为什么它必须那么困难?在ADO.NET数据表更容易,如果我删除一行,它发生来自db然后它标记它删除,如果它是一个新行然后它从集合中删除它,完成!在投入了很多努力学习LINQ to SQL后,我不想回到数据集
非常感谢任何帮助
谢谢 巴萨姆
答案 0 :(得分:2)
我发现了问题所在并解决了它。如果其他人遇到同样的问题,我想在这里分享信息
首先,我想提一个重要的事实:如果在DB中启用了Cascade Delete,那么
DeleteOnNull:=True , DeleteRule:="CASCADE"
将自动插入.dbml文件后面的代码中,而无需为特定关联手动添加DeleteOnNull=True
。
问题是,FKey
的子实体中还有另一个OrderType
,即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文件{{{ 1}}),它会在尝试首先保存到DB之前引发异常。
这个问题通过以下方式解决:
Nullable=False
这会手动删除其他NewOrder.OrderType = NOTHING
的关联。然后,只需删除子实体将导致LINQ to SQL在调用FKey
时忽略它。
谢谢你 巴萨姆穆罕默德。