【问题标题】:Do I need to create DTOs if I am using EF and Viewmodels? [duplicate]如果我使用 EF 和 Viewmodels,是否需要创建 DTO? [复制]
【发布时间】:2025-12-19 20:10:12
【问题描述】:

我已经读过实体框架(我使用的是 EF6)是数据库的抽象。我正在使用视图模型将数据提供给我的视图,因此 EF 实体不会经过我的控制器。我正在使用带有 linq 查询的存储库来获取数据。在控制器中,我实例化 repo 并获取数据。

那么有什么理由为控制器和repo之间的事务创建一个专用对象吗?

例子:

数据库有一个表 Person。

在 MVC 应用程序中,我创建了一个 edmx 文件,该文件创建了一个名为 Person 的部分类。

在我的存储库中:

class Person PersonRepository()
{
    public Person GetPerson()
    {
      using (var db = new MyEntity())
      {
        var data = db.Person.FirstOrDefault();

        var person = new Person()
        {
            Id = data.PersonId,
            FirstName = data.FirstName,
            LastName = data.LastName
        };
        return person;   
    }
}

或者我需要这样做:

class Person PersonRepository()
{
    public Person GetPerson()
    {
      using (var db = new MyEntity())
      {
        var data = db.Person.FirstOrDefault();

        var person = new PersonDTO()
        {
            Id = data.PersonId,
            FirstName = data.FirstName,
            LastName = data.LastName
        };
        return person;   
    }
}

【问题讨论】:

  • class Person PersonRepository() 这还能编译吗?
  • 简短回答否,鉴于您使用的是 POCO,请看这里*.com/questions/3779508/…
  • 在您提供的示例中,我会说即使做您现在的工作也没有意义,当然,如果您需要将视图特定数据添加到视图模型,这可能会改变,但您可以重构何时何地。记住 YAGNI(你不会需要它)。

标签: c# entity-framework model-view-controller


【解决方案1】:

这完全取决于您的应用程序的预期复杂性。所以没有一种方法可以做这样的事情。 基本上,DTO 类应该只包含需要传输到前端层的字段,而 ViewModel 类包含专门适用于视图的数据。 您必须问自己一个问题,这些对象的设计是否相同,即业务层是否不会被某些视图特定的逻辑和概念污染,或者视图层是否不会被某些数据/业务污染层相关逻辑。 如果应用程序不是很大,并且视图所需的数据和从存储库中获取的数据预计不会有太大差异,您可以只使用 ViewModel 类,但如果有一些差异,或者将来可能会有,最好有单独的类并处理映射器上的差异。

【讨论】:

  • 如果它是一个 web api 应用程序会有什么不同吗?
  • 你的意思是Person类通过WebAPI发送到浏览器,然后一些JS框架负责显示它?如果是 - 我会说在 C# 中,我们在控制器上提供了 DTO 类,我会将 ViewModel 概念放入应用程序的 JS 端
最近更新 更多