实体框架在删除之前检查引用

时间:2013-03-22 03:03:18

标签: reference entity-framework-4 constraints

假设我有一个我想删除的用户,但数据库中的其他表可能会引用用户。有没有办法在尝试删除之前检查对该用户的引用,或者是删除和捕获/处理SaveChanges()引发的异常的最佳选择?

显然,我可以检查用户可能被引用的每个表...但我不愿意,因为它在一些地方被引用,它似乎是一种混乱的方式来做事情。

1 个答案:

答案 0 :(得分:2)

如果你已经找到解决方案,我现在还没有,但是我发布了,因为我自己遇到了类似的问题。我想你可以使用查询来检查引用,比如说..

bool related = db.Article.Where(i => i.CategoryId == id).Any();

但我相信抓住异常比检查参考更好。

对于您想要所需关系但没有级联删除的情况 可以使用显式覆盖约定并配置级联删除行为 流畅的API。 要使用的Fluent API方法称为 WillCascadeOnDelete ,并将布尔值作为 参数。此配置应用于关系,这意味着您首先 需要使用Has / With配对指定关系,然后调用WillCascadeOn 删除。类似的东西:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Article>()
            .HasRequired(a => a.Category)
            .WithMany(i => i.Articles)
            .WillCascadeOnDelete(false);
        base.OnModelCreating(modelBuilder);
    }

然后,您通常会获得DbUpdateException或InvalidOperationException,具体取决于数据如何加载到内存中。您可以使用简单的语句捕获它们并向用户添加消息。

try
{
  db.Category.Remove(category);
  db.SaveChanges();
  return RedirectToAction("Index");
}
catch (DataException)
{
ModelState.AddModelError("", "Your message here");
return View(category);
}

WillCascadeOnDelete基本上做的是它将数据库中的删除规则从级联更改为无操作,这会导致在发生违规时抛出错误。 这里的总体信息是您可以控制级联删除设置,但是 您将负责避免或解决由此引起的可能冲突 没有级联删除存在。它对我有用,希望它对你也有帮助。 另见:Configuring Relationships with the Fluent API