假设我有一个要删除的用户,但该用户可能被数据库中的其他表引用。有没有办法在尝试删除之前检查对该用户的引用,或者只是删除并捕获/处理SaveChanges()
抛出的异常的最佳选择?
显然,我可以检查可能引用用户的每个表......但我宁愿不这样做,因为它在一些地方被引用,而且这似乎是一种混乱的做事方式。
假设我有一个要删除的用户,但该用户可能被数据库中的其他表引用。有没有办法在尝试删除之前检查对该用户的引用,或者只是删除并捕获/处理SaveChanges()
抛出的异常的最佳选择?
显然,我可以检查可能引用用户的每个表......但我宁愿不这样做,因为它在一些地方被引用,而且这似乎是一种混乱的做事方式。
如果您还没有找到解决方案,我现在不知道,但我正在发布,因为我自己也遇到了类似的问题。我想你可以使用查询来检查引用让我们说类似..
bool related = db.Article.Where(i => i.CategoryId == id).Any();
但我相信捕捉异常比检查参考更好。
对于您想要一个必需的关系但没有级联删除的场景,您可以显式覆盖约定并使用 Fluent API 配置级联删除行为。要使用的 Fluent API 方法称为WillCascadeOnDelete,并将布尔值作为参数。此配置应用于关系,这意味着您首先需要使用 Has/With 配对指定关系,然后调用 WillCascadeOn Delete。就像是:
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 基本上所做的是将数据库中的 Delete 规则从Cascade更改为No Action,这会导致在发生违规时引发错误。这里的总体信息是您可以控制级联删除设置,但您将负责避免或解决由于不存在级联删除而导致的可能冲突。它对我有用,希望它对你也有帮助。另请参阅:使用 Fluent API 配置关系