我有两个主从关系的表。我们使用DataGridView来处理详细记录。详细记录有带有查找值(外键)的字段。我们不设置查找表的ID值,而是设置对象值。这一切都很好,而不是一种情况。如果我们添加了一个详细信息行并设置了至少一个查找字段,并且在保存(提交更改)之前删除了这一行,我们会收到这个错误:
试图删除TableX和tableley之间的关系。但是,关系的一个外键(table . tablexid)不能设置为空。
这个问题在这个问题中讨论过(向下滚动到Neil Barnwell的回答),但是它没有对这个特定的问题给出答案。解决方案"调用数据上下文"。GetChanges"没有帮助,因为Datacontext没有暴露方法GetChanges和GetChangedset失败并产生相同的错误。
我认为在删除行时存在某种错误。将详细行添加到主行时,它会自动附加到上下文。所以如果你加上:
myMasterRow.DetailsRows.Add(myDetails);
您必须使用DeleteOnSubmit
来反转添加:
context.DetailsRows.DeleteOnSubmit(myDetails);
数据上下文足够聪明,可以将删除视为"撤消添加",因此条目永远不会触及数据库。
看起来,如果你设置了一个实体的对象并在任何提交之前删除了新记录,Linq仍然认为你想添加新记录。在这种情况下,您必须将所有具有FK引用的对象设置为null。
请参阅这篇详细描述问题和解决方案的文章:http://social.msdn.microsoft.com/Forums/en/linqtosql/thread/4170c7bb-f727-4e6a-9190-fc268ae4ce4b