【问题标题】:ASP.NET MVC: using EF entities as viewmodels? [duplicate]ASP.NET MVC:使用 EF 实体作为视图模型? [复制]
【发布时间】:2011-04-27 14:41:39
【问题描述】:

可能重复:
ASP.NET MVC - Linq to Entities model as the ViewModel - is this good practice?

在 ASP.NET MVC 中可以使用 EF 实体类作为视图模型吗?

如果 viewmodel 与 EF 实体类 90% 相同怎么办?

假设我在实体框架模型中有一个调查类。它 90% 匹配查看编辑所需的数据。 与视图模型应该具有的唯一区别 - 是要在其中使用的一个或多个属性(填充调查对象所需的属性,因为 EF 类不能直接映射到其属性的表示方式(子复选框、单选组等) .))

您是否使用 ViewData[] 传递它们?或者创建一个带有新附加属性的调查类 (SurveyViewModel) 的副本(它应该能够从调查中复制数据并返回给它)?

编辑: 我也试图避免使用 Survey 作为 SurveyViewModel 属性。当使用 UpdateModel 或默认绑定器更新某些 Survey 属性时,看起来会很奇怪,而其他(不能直接映射到实体) - 在控制器中使用 SurveViewModel 自定义属性。

【问题讨论】:

    标签: asp.net-mvc viewmodel


    【解决方案1】:

    我喜欢使用Jimmy Bogard's approach,因为视图和视图模型之间始终保持 1:1 的关系。换句话说,我不会使用我的域模型(在这种情况下是您的 EF 实体)作为视图模型。如果您觉得您需要在两者之间进行大量映射,您可以使用 AutoMapper 之类的东西来为您完成这项工作。

    【讨论】:

    • Automapper +1 ... 刚刚找到,我很喜欢。
    • ValueInjecter 好多了
    • Automapper 改变了我的生活,它非常有用,尤其是当您习惯它并学会映射导航属性时。
    【解决方案2】:

    有些人不喜欢将这些模型类一直传递到视图,尤其是因为它们是与您当前使用的特定 ORM 相关联的类。这确实意味着您将数据框架与视图类型紧密绑定。

    但是,我已经在几个简单的 MVC 应用程序中完成了这项工作,使用 EF 实体类型作为一些强类型视图的模型 - 它工作正常并且非常简单。有时简单的胜利,否则您可能会发现自己在应用程序中在几乎相同的模型类型之间复制值时投入了大量精力和代码,而实际上您永远不会离开 EF。

    【讨论】:

    • +1 这个,很棒的评论。
    【解决方案3】:

    您应该始终拥有视图模型,即使它们是 1:1 的。有实际原因,而不是我将重点关注的数据库层耦合。

    域、实体框架、nhibernate 或 linq 2 sql 模型作为您的视图类的问题是您无法很好地处理上下文验证。例如给定一个用户类:

    当一个人在您的网站上注册时,他们会看到一个用户屏幕,然后您:

    1. 验证名称
    2. 验证电子邮件
    3. 验证密码是否存在

    当管理员编辑用户名时,他们会看到一个用户屏幕,然后您:

    1. 验证名称
    2. 验证电子邮件

    现在通过 FluentValidation、DataAnnotations 属性,甚至业务类上的自定义 IsValid() 方法公开上下文验证,并仅验证名称和电子邮件更改。你不能。您需要将不同的上下文表示为不同的视图模型,因为对这些模型的验证会根据屏幕表示而变化。

    以前在 MVC 1 中,您可以通过简单地不发布您不想验证的字段来解决此问题。在 MVC 2 中,这种情况发生了变化,现在模型的每个部分都经过验证、发布与否。


    罗伯特·哈维指出了另一个好点。您的用户实体框架如何显示屏幕并验证双重密码匹配?

    【讨论】:

    • 您提出了一个有效的观点,但是如果您要进行双密码输入匹配,那么您的视图模型与实体模型对象并不是真正的 1:1,是吗?
    • @Robert Harvey,是的,我应该使用不同的示例。验证密码是否存在更好,因为在管理员编辑时您永远不会更改密码。谢谢,我会改的。
    【解决方案4】:

    在较大的项目中,我通常根据风格将业务对象与数据对象分开。这是让程序和数据库同时更改并且只影响控制(或 VM)层的一种更简单的方法。

    【讨论】:

    • MVC 上下文中的视图模型是指专门为 MVC 视图使用而设计的模型类。它们通常只是一个具有代表领域模型子集的属性的类。
    • 感谢您的反馈。我已经有几年没有使用 MVC 了。我认为这只是当时 MS 的指导和一些课程。该部分必须与 MVVM 合并。
    猜你喜欢
    • 2011-07-04
    • 1970-01-01
    • 1970-01-01
    • 2012-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-16
    • 2014-11-30
    相关资源
    最近更新 更多