假设我有一个我想删除的用户,但数据库中的其他表可能会引用用户。有没有办法在尝试删除之前检查对该用户的引用,或者是删除和捕获/处理SaveChanges()
引发的异常的最佳选择?
显然,我可以检查用户可能被引用的每个表...但我不愿意,因为它在一些地方被引用,它似乎是一种混乱的方式来做事情。
答案 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