Entity Framework - 如何删除链接元素

Entity Framework - how to remove linked elements

我有以下型号:

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

        if (ef_vacancy.Swaps != null)
            ef_vacancy.Swaps.Clear();

当我想执行 SaveChanges 时出现错误:

The operation failed: The relationship could not be changed because one or more of the foreign-key properties is non-nullable. When a change is made to a relationship, the related foreign-key property is set to a null value. If the foreign-key does not support null values, a new relationship must be defined, the foreign-key property must be assigned another non-null value, or the unrelated object must be deleted.

所以,Entity Framework 尝试将 "null" 设置为 Swap.VacancyID table 而不是删除记录。但我想删除。如果我尝试执行以下操作:

        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);

有时有效,有时无效!我不明白为什么它有效,为什么不有效。 如何正确完成这个简单的动作?

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

答案正文(归功于Craig Stuntz):

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);
    }
}

您可以使用部分 class.

将其构建到您的实体中

您应该手动删除 ef_vacancy.Swaps 中的子项目。 Entity Framework 不会为你做那件事。它最终无法决定你想对旧的子项目做什么——如果你想把它们扔掉,或者你想保留它们并将它们分配给其他父实体。不可能将它从 Swaps 集合中删除,因为它不能单独存在,因为它有一个不可为空的外键引用 Vacancy(VacancyId)。您可以通过这种方式删除交换:

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