1

我在灯开关论坛上发布了这个问题,但一无所获。我想在放弃 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 脚本相同的顺序删除所有内容。但是,在运行时,我收到此错误:

操作失败:无法更改关系,因为一个或多个外键属性不可为空。当对关系进行更改时,相关的外键属性将设置为空值。如果外键不支持空值,则必须定义新关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象。

当我分析数据库时,我可以看到很多选择,但没有尝试删除,所以 Lightswitch 只是认为会有问题。我该怎么做才能找出问题所在?从模型中删除各种相关实体永远不会产生任何不同的消息。

4

2 回答 2

0

下面是一些能够成功删除 3 部分关系的示例代码:VS LightSwitch 应用程序中的 Person - Child - Grandchild。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();
        }
    }

这段代码与您发布的示例代码具有不同的结构,这让我感到震惊。特别是,这段代码有一个从中间子实体中删除孙子实体的内部循环。由于您没有内部循环,因此您必须采用不同的策略来删除示例中未显示的孙子,或者这就是问题所在。

于 2011-09-12T17:21:47.617 回答
0

我遇到了同样的问题,发现另一个开发人员将代码放在了孩子的删除和删除事件中,这个代码导致了错误。

希望这可以帮助其他面临同样问题的人。

于 2013-10-25T12:01:14.120 回答