2013-03-22 3 views
0

Скажите, что у меня есть Пользователь, которого я хочу удалить, но на пользователя могут ссылаться другие таблицы в базе данных. Есть ли способ проверить ссылки на этого пользователя, прежде чем пытаться удалить или является наилучшим вариантом просто удалить и поймать/обработать исключение, которое SaveChanges() выбрасывает?Entity Framework Проверьте ссылки перед удалением

Очевидно, что я мог бы проверять каждую таблицу, где пользователь может ссылаться на, но я бы предпочел не так, как он упоминается в нескольких местах, и это просто похоже на беспорядочный способ сделать что-то.

ответ

2

Я не сейчас, если вы нашли решение для этого, но я отправляю его, так как сам сталкиваюсь с подобной проблемой. Я полагаю, вы могли бы использовать запрос для проверки ссылок позволяет сказать что-то вроде ..

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

+0

Отличное объяснение, спасибо. Я в конечном итоге пошел с решением «поймать ошибку», поскольку это казалось самым опрятным способом обработки вещей. – Trent

Смежные вопросы