MVC,强类型视图和实体框架困境

时间:2012-09-13 11:02:34

标签: asp.net-mvc entity-framework linq-to-entities

我读了很多Q&与MVC架构中的视图中的逻辑相关,并且在大多数情况下,我同意业务逻辑不应该存在于视图中。不过已经这么说了,我在使用Microsoft的MVC框架和实体框架时经常质疑我的方法,因为单个实体可以轻松访问外键关系,这最终会导致我在内部执行Linq to Entities查询。图。

例如:

如果我有以下两个实体:

产品([PK] ProductId,Title,Amount)

图片([PK] ImageId,[FK] ProductId,ImageTitle,DisplayOrder)

假设我有一个强类型的产品视图,并且我想显示主图像(最低显示顺序),那么我可以在视图中执行以下操作:

@{
     Image image = (from l in Model.Image
                    orderby l.DisplayOrder
                    select l).FirstOrDefault();
}

这是一个用于演示目的的简单示例,但肯定会开始弯曲与MVC架构相关的规则,但另一方面在Controller中执行此操作然后(天堂禁止)将其插入ViewBag或ViewData将肯定是同样多的犯罪行为,并且管理多个不同的相关课程会变得很痛苦。

我曾经为复杂模型创建自定义类,但它耗时且难看,我不再看到这一点,因为实体框架可以快速轻松地将View定义为主要模型(在本例中为产品)然后使用Linq查询轻松检索产品的所有外围组件。

我很想知道其他人如何处理这种情况。

编辑:

我也经常这样做:

@foreach(Image i in Model.Image.OrderBy(e => e.DisplayOrder).ToList())
{
   <img ... />
}

1 个答案:

答案 0 :(得分:0)

我要去'模型的自定义类'的方式,我同意它耗费时间和平凡,因此创建了像http://automapper.codeplex.com/这样的工具,以配合你执行此任务。

总的来说,我对你有类似的感受。阅读一些东西说你的域模型与你的存储无关,然后你的视图模型与域模型不同,然后看到这些库实际上似乎“促进”了简单的方法(对你的域类的数据注释似乎比EF流畅的界面等更简单。)

至少我们有选择的猜测!

模型绑定还有一个问题是,当您想要回发模型数据并将其存储在数据库中时,您需要小心并确保MVC模型绑定器正确绑定所有字段。否则你可能会丢失一些数据。使用自定义视图模型,它可能更简单。

<强>验证 MVC为您提供了一种验证使用属性的方法,当您使用视图模型时,您可以使用此类注释自由地污染它,因为它是特定于视图的(并且验证应该是视图/控制器操作特定的)。当您使用EF类时,您将使用不相关(并且可能相互冲突)的逻辑来污染这些类。