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;
}
我有以下型号:
我有一个实体空缺的对象(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;
}