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