Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.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
C# 实体框架-如何删除链接元素_C#_Entity Framework 6 - Fatal编程技术网

C# 实体框架-如何删除链接元素

C# 实体框架-如何删除链接元素,c#,entity-framework-6,C#,Entity Framework 6,我有以下型号: 我有一个实体空缺对象(ef_entity),由DB提供,它已经有一个链接交换元素(也由DB提供)。我只想删除它: if (ef_vacancy.Swaps != null) ef_vacancy.Swaps.Clear(); 当我想进行保存更改时,我会收到一个错误: 操作失败:无法更改关系,因为 一个或多个外键属性不可为空。当 对关系进行更改时,相关的外键属性为 设置为空值。如果外键不支持空值, 必须定义新关系,外键属性必须为 指定了另

我有以下型号:

我有一个实体空缺对象(ef_entity),由DB提供,它已经有一个链接交换元素(也由DB提供)。我只想删除它:

        if (ef_vacancy.Swaps != null)
            ef_vacancy.Swaps.Clear();
当我想进行保存更改时,我会收到一个错误:

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

所以,实体框架尝试将Swap.VacancyID表设置为“null”,而不是删除记录。但我想删除。如果我尝试执行以下操作:

        var swap_to_delete = (from i in _db.Swaps where i.VacancyID == ID.Value select i).FirstOrDefault();
        if (swap_to_delete != null && _db.Entry(swap_to_delete).State != EntityState.Deleted)
            _db.Swaps.Remove(swap_to_delete);
它有时有效,有时无效!我不明白它为什么有效,为什么不。
如何正确执行此简单操作?

这应该可以回答您的问题:

答覆全文(请参阅):

Clear()删除对实体的引用,而不是实体本身

如果希望此操作始终相同,则可以处理AssociationChanged:

Entity.Children.AssociationChanged += 
new CollectionChangeEventHandler(EntityChildrenChanged);
Entity.Children.Clear();            

private void EntityChildrenChanged(object sender,
    CollectionChangeEventArgs e)
{
    // Check for a related reference being removed. 
    if (e.Action == CollectionChangeAction.Remove)
    {
        Context.DeleteObject(e.Element);
    }
}

您可以使用分部类将其构建到实体中。

您应该删除
ef\u.Swaps中的子项。手动逐个交换。实体框架不会为您这样做。它最终无法决定您要对旧的子项执行什么操作—是要将它们扔掉,还是要保留它们并将其分配给其他父实体。不能仅从
交换
集合中删除它,因为它本身不可能存在,因为它有一个引用
空缺
VacancyId
)的不可空外键。您可以通过以下方式删除掉期:

foreach (var child in ef_vacancy.Swaps)
{
   db.Entry(child).State = EntityState.Deleted;
}

此外,请点击链接并对原始答案进行投票,而不是对该答案进行投票。