Я не сейчас, если вы нашли решение для этого, но я отправляю его, так как сам сталкиваюсь с подобной проблемой. Я полагаю, вы могли бы использовать запрос для проверки ссылок позволяет сказать что-то вроде ..
bool related = db.Article.Where(i => i.CategoryId == id).Any();
Но я считаю, что лучше ловить исключение, чем для проверки ссылок.
Для сценариев, где требуется требуемая связь, но без каскада удалите может явно переопределить соглашение и настроить поведение каскадного удаления с помощью Fluent API . Используемый метод Fluent API называется WillCascadeOnDelete и принимает значение Boolean как параметр . Эта конфигурация применяется к отношению, что означает, что вы сначала должны указать отношение, используя сопряжение 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
Отличное объяснение, спасибо. Я в конечном итоге пошел с решением «поймать ошибку», поскольку это казалось самым опрятным способом обработки вещей. – Trent