Можно ли избежать повторных попыток поймать в этом сценарии? - PullRequest
1 голос
/ 21 марта 2012

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

Текущая ситуация: модель содержит список ящиков.Каждая коробка имеет контейнер.Защита от удаления Контейнера во избежание ошибок означает использование try catch.

Нет обработки ошибок,

<td>@m.Container.Name</td>

Обработка ошибок,

<td>@try{@m.Container.Name}catch { Deleted }</td>

Во многих списках есть похожие ситуации, когдавозможно, что реляционные данные могут быть удалены.Есть ли лучший способ выполнить это, кроме этого подхода try catch?

Дополнительный код, который поможет с примером:

Модель просмотра:

public class BoxVM
{
 List<Box> Boxes { get; set; }
}

Модели:

public class Box
{
 public int BoxId { get; set; }
 public Material Material { get; set; }
 public Container Container { get; set; }
}

public class Material
{
 //fk
 public int BoxId { get; set; }
 public string Description { get; set; }
}

public class Container
{
 //fk
 public int BoxId { get; set; }
 public string Name { get; set; }
}

Контроллер:

public ActionResult showBoxList()
{
 var vm = new BoxVM();
 vm.boxes = _boxRepo.Get().ToList();
 var materials = _materialRepo.Get().ToList();
 var containers = _containerRepo.Get().ToList();
 foreach(var box in vm.boxes)
 {
  box.Material = materials.Where(m => m.BoxId == box.BoxId).Single();
  box.Container = containers.Where(c => c.BoxId == box.BoxId).Single();
 }
 return View(vm);
}

Вид:

@model BoxVM

foreach(var m in Model.boxes)
{
 <p>@m.Container.Name</p> @*// Breaks if specific container was deleted *@
 <p>@try{@m.Container.Name}catch{<text>Deleted</text>}</p> @*// Doesn't break, but is there a better way? *@
}

Ответы [ 2 ]

0 голосов
/ 05 апреля 2012

Есть ли лучший способ сделать это помимо этого подхода к улову попыток?

Да.Используйте подход, который поддерживает многословную политику ссылочной целостности, позволяющую удалять один узел в графе объектов при сохранении актуальности графа объектов.

0 голосов
/ 21 марта 2012

Ну, не знаю, каковы ваши требования к дисплею, но простой способ это сделать:

foreach(var m in Model.boxes)
{
    if (null != m.Container)
    {
        <p>@m.Container.Name</p>
    }
}

плюс еще часть, если вам нужно что-то отобразить.Вы также можете сделать это встроенным.

Подробнее об этом:

Если здесь нет подходящего контейнера:

box.Container = containers.Where(c => c.BoxId == box.BoxId).Single();

, вы должны получить исключение из-за Single().Каково содержание box.Container, когда вы выходите из этой строки?

...