有时,已被引用的用户从数据库中删除数据。在剃须刀中尝试抓住它会很好,但还有另一种方法吗?
现状:该模型包含一个Box列表。每个盒子都有一个容器。保护容器删除以避免错误意味着使用try catch。
无错误处理,
<td>@m.Container.Name</td>
错误处理,
<td>@try{@m.Container.Name}catch { Deleted }</td>
许多列表都有类似的情况,可能会删除关系数据。除了这种尝试捕捉方法之外,还有更好的方法来实现这一目标吗?
一些额外的代码可以帮助您举例:
查看型号:
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? *@
}
答案 0 :(得分:0)
嗯,不知道你的显示要求是什么,但简单的方法是:
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
的内容是什么?
答案 1 :(得分:0)
除了这种尝试捕捉方法之外,还有更好的方法来实现这一目标吗?
是。使用支持详细参照完整性策略的方法,允许删除对象图中的单个节点,同时保持对象图的相关性。