调用.Remove()正在执行UPDATE语句而不是DELETE,并导致错误:“无法将值NULL插入列”

时间:2012-10-25 14:03:06

标签: sql entity-framework

以下是我要删除对象的代码片段:

var foo = this.repository.GetFoo();

foreach (var item in foo.RelatedItems.ToList()) {
    if (x == y) {
        //Update happens here; this isn't executing however.
    } else {
        //This code block is executed; this is where I am telling the context to mark this object for deletion.
        foo.RelatedItems.Remove(item);
    }
}

this.repository.Save();

当调用.Save()时,我收到一个错误:“无法将值插入列”。我使用分析器来查看实际执行的SQL是什么,它是:

update dbo.RelatedItems
set foreignKey = null
where id = X

我希望在这里执行delete语句,但是,由于某种原因,它试图通过将外键设置为null来更新记录。

修改

我将以下代码添加到我的存储库类中以解决此问题:

public void DeleteItem(Item item) {
    context.Entry(item).State = System.Data.EntityState.Deleted;
}

1 个答案:

答案 0 :(得分:0)

请参阅此相关问题:EF 4: Removing child object from collection does not delete it - why?

显然RemoveDelete之间存在语义差异,其中Remove只会通过删除外键孤立行,而Delete实际上会将记录删除该表。

其他问题的用户vittore建议

dbcontext.DeleteObject(item);

在循环中。