无法将空值插入到“Remove”列中的问题

6
我正在使用Entity Framework执行Remove()操作。当我尝试运行SaveChanges()时,提示我无法将NULL插入到不允许的列中。这对我来说很奇怪,因为我没有进行任何INSERT操作,并且我检查了30个现有条目中的每一个,发现它不应该尝试在该列中保存空值。
以下是相关的代码:
var user = db.AspNetUsers.FirstOrDefault(u => u.Id == userId);
if (user != null)
{
    var itemsToRemove = user.ItemXrefs.Where(i => !itemIDs.Contains(i.ItemID)).ToList();

    foreach (var xref in itemsToRemove)
    {
        user.ItemXrefs.Remove(xref);
    }

    db.SaveChanges();
    //...
}

你能提供实际的异常和涉及到的POCO类吗?这个错误是发生在被删除的实体上还是相关实体上? - Kritner
你查询了 user.ItemXfefs 并从 user.Items 中删除结果,这有点令人困惑。难道你不应该从同一个集合中删除项目吗?或者至少验证 user.Items 是否包含你要删除的项目? - Rufus L
@RufusL 这是我为了这个问题简化代码时犯的一个错误 - 已经修复了。 - muttley91
我敢打赌这与必需关系有关(非空外键列)。您想要仅删除关系还是删除实体? - danludwig
问题出在非空外键上有点奇怪,因为在 SaveChanges() 运行之前表中并没有任何 NULL 值。 - muttley91
显示剩余2条评论
1个回答

6
请尝试使用以下方法:
itemXrefSet = db.Set<ItemXref>();
foreach (var xref in itemsToRemove)
{
    itemXrefSet.Remove(xref);
}
db.SaveChanges();

这应该会从动名词表中删除交叉引用实体以及它连接的两个实体之间的关系。
你尝试进行操作时出现错误的原因是EntityFramework认为你只想删除关系,而不是删除相关实体。当EF这样做时,它会尝试将依赖表中的外键列设置为NULL。解决这个问题的方法要么通过更改UserId列值来将表行与另一个用户相关联,要么删除表行,因为你无法将必需的列值设置为NULL。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接