我在the lightswitch forum上发布了此问题,但什么都没有。我以为在放弃Lightswitch之前我会再试一次。
我正在使用定义良好的关系约束来实现对Sql Server数据库的删除。由于各种原因,我无法在这些关系上指定级联删除。
我的方法似乎正确,因为我成功删除了一个实体类型。在实体的删除事件中,我将删除所有相关的孩子:
entity.simpleChild.Delete();
foreach (var child in entity.complexChild)
{
((IEntityObject)child).Delete();
}
foreach (var child in entity.ChildWithGrandChildren)
{
foreach (var grandChild in child.Children)
{
((IEntityObject)grandChild).Delete();
}
child.Delete();
}
然而,我的一个实体类型失败了。这个实体有孙子,但我也删除了这些。不仅如此,当我评论删除孙子并试图删除没有相关孙子的实体时,我得到了同样的错误。我正在以与工作的TSQL脚本相同的顺序删除所有内容。但是,在运行时,我收到此错误:
操作失败:无法更改关系,因为一个或多个外键属性不可为空。当对关系进行更改时,相关的外键属性将设置为空值。如果外键不支持空值,则必须定义新关系,必须为foreign-key属性分配另一个非空值,或者必须删除不相关的对象。
当我分析数据库时,我可以看到很多选择,但没有尝试删除,因此Lightswitch只是认为会出现问题。我该怎么做才能找出问题所在?从模型中删除各种相关实体永远不会产生任何不同的消息。
答案 0 :(得分:0)
以下是一些能够成功删除3部分关系的示例代码:人物 - 儿童 - VS LightSwitch应用程序中的孙子。 SQL服务器表定义正在使用DELETE NO ACTION,就像您的示例一样。
partial void People_Deleting(Person entity)
{
foreach (var child in entity.Children)
{
foreach (var grandchild in child.GrandChildQuery)
{
((IEntityObject)grandchild).Delete();
}
child.Delete();
}
}
我很惊讶这个代码的结构与你发布的示例代码不同。特别是,此代码具有内部循环,用于从中间子实体中删除孙子。由于您没有内循环,因此您必须采用不同的策略来删除样本中未显示的孙子,或者这是问题。
答案 1 :(得分:0)
我遇到了同样的问题并且不鼓励另一位开发人员在代码中删除和删除了孩子的事件,这段代码导致错误。
希望这能帮助其他人面对同样的问题。