最佳实践实体框架模型与ViewModels

时间:2014-03-01 06:19:25

标签: c# asp.net-mvc entity-framework viewmodel

根据我的阅读,我理解我们应该始终将视图模型传递给视图。但是,有时这个视图模型与EF模型完全相同或几乎相同。这个问题(重复代码)是否可以接受或有任何解决方法?

例如,如果我有这个EF模型:

class UserModel
{
    string id {get;set}
    string name {get;set}
    string address {get;set}
    string phone {get;set}
    string website {get;set}
}

viewmodel应该如何......像这样:

class UserViewModel
{
    string name {get;set}
    string address {get;set}
    string otherobject {get;set}
}

或者像这样:

class UserViewModel
{
    UserModel user;
    string otherobject {get;set}
}

使用选项#1,重复属性...在另一个视图模型中,它们将再次重复。我需要在每个视图模型上重复所有数据注释。但是,我只发送了我需要的属性。

使用选项#2,没有重复,但我传递了许多我不需要的属性。

最后一个选项是根据需要混合选项#1和选项#2 ......但由于缺乏通用标准,我不喜欢这个选项。有时,属性将在视图模型中定义和数据注释,有时在EF模型中定义。

我希望有一个选项#4,我看不到......?

谢谢。

2 个答案:

答案 0 :(得分:2)

这些类的不同之处在于您的应用程序与之交互的方式。 模型 ViewModel 有不同的受众群体。

您的模型应该与您的应用程序进行交互,有时很多人更喜欢在EF Code First中将这些模型用作实体。它们就是我们所说的Domain Objects。

另一方面, ViewModels 应该与您的视图进行交互。在服务层中,您使用某些数据填充 ViewModel ,然后您可以从控制器访问它们。

  

但是,有时这个视图模型与EF模型完全相同或几乎相同。

此处的关键字是“有时”。你是对的,对于一个非常简单的应用程序,你甚至不需要考虑 ViewModels ,在大多数情况下你可以简单地使用你的模型。但是,请考虑一些情况,例如您要显示最新帖子列表最新评论,并说明一些相关帖子单一视图。你要做什么?这是 ViewModels 的来源。您将特定的 ViewModel 传递给您的视图,其中包含所有必要的数据,帖子,评论和相关帖子。

在大多数情况下, ViewModel 应该来自多个模型,有时候, ViewModel porperties模型

的类型

答案 1 :(得分:1)

我知道自问这个问题以来已经有一段时间了。但是,这可能有助于寻找答案的人。

尽管ViewModel与模型几乎相同,但建议使用相同的代码创建ViewModels。

可能的原因是

  1. 您可能希望使用数据注释向属性添加验证。 建议不要进行更具体的验证 屏幕在您的模型中应该是您的反射 数据库结构。

  2. 您的ViewModel将来可能会发生变化。现在可能没有意义,但是 总有可能。

  3. 如果您担心映射代码在大多数情况下看起来很明显,您可以使用Automapper。

    干杯!