2012-03-20 69 views
1

有时数据被一个被引用的用户从数据库中删除。剃刀上的尝试抓住这一点很好,但有没有另一种方式?可能避免在这种情况下重复尝试捕获吗?

现状:该模型包含一个Boxes列表。每个盒子都有一个容器。防止容器删除以避免错误意味着使用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

我们可以看到这个动作吗?如果删除发生在那里,您已经知道删除了什么。 – veblock 2012-03-20 23:38:01

+0

@veblock - 我发布了一个更详细的例子。 – 2012-03-20 23:46:59

回答

0

除了这个try catch方法之外,还有更好的方法来完成这个吗?

是的。使用支持详细参照完整性策略的方法,允许删除对象图中的单个节点,同时保持对象图的相关性。

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的内容是什么?

+0

调用.Container将抛出一个objectcontext异常。 – 2012-03-21 00:40:54

+0

您是否使用EF,Code First或EF与已有的数据库? – veblock 2012-03-21 00:56:41

+0

谁不使用EF? – 2012-03-21 19:12:22