【问题标题】:MVC Architechture - models and entitiesMVC 架构 - 模型和实体
【发布时间】:2014-06-21 13:49:32
【问题描述】:

为了制作我的网络应用程序项目,我使用了一些教程并下载了 2 个示例项目。我注意到在这两个实体中,实体都是从 SQL 服务器导入到项目中的,并且为每个相关类创建了模型。据我了解,实体代表数据库本身,而模型是检查验证的模型(例如),验证成功通过后,数据被发送到实体,实体又将其输入数据库(?)。

在我的项目中,我根本没有模型。我认为实体代表模型,因此我为什么要创建重复的类(而不是看起来相似的实体和模型)。 所有数据注释都在实体类中。 有人告诉我,对 SQL 服务器内的表所做的每一次更改都会抹去我的全部工作。

我想知道它是否正确,以及为什么我实际上需要模型而不是实体。 如果需要模型,您如何将它们的数据实际传递到实体中?

编辑: 我发现这篇帖子Difference between model and entity 回答了我的大部分问题。 我想知道每当我在 SQL 服务器中更改一个简单的东西时,我的整个实体类的注释是否都会被删除。 为什么模型类不能完全复制实体类(除了数据注释)?

【问题讨论】:

    标签: c# asp.net-mvc entity-framework visual-studio asp.net-mvc-4


    【解决方案1】:

    因为正如您正确指出的那样,如果您刷新了 edmx 文件,您的实体将被删除并重新创建。

    如果您使用部分类并将业务规则放入其中,您实际上可能会丢失模型层,但拥有模型层的意义在于,为模型编写单元测试比为实体编写单元测试要简单得多。

    我建议你在学完基础知识后,继续学习Domain Driven Development (DDD) 和Test Driven Development(TDD)。那时你所有的问题都会得到解答,因为如果我现在用所有的理论轰炸你,你可能会迷失方向,或者认为这比实际上要困难得多..

    【讨论】:

      【解决方案2】:

      假设您的实体是Person。您决定将实体作为模型,而不是不同的类。

      在您看来(编辑现有人员),有一个带有国家名称的下拉列表(人员需要一个国家实体)。因此,这意味着您需要一份所有可能国家/地区的列表,以便用户选择一个。

      您如何通过该国家/地区列表?

      好吧,如果您有一个单独的类用作模型,您可以轻松添加一个新属性,将国家/地区列表放入其中,然后从您的视图中获取它。

      因此,此示例的视图模型将是:

      public class PersonEditModel
      {
          public Person PersonToEdit { get; set; } //This is your entity from before
      
          public List<Country> Countries { get; set; } //Extra data for the view
      }
      

      将您的模型视为一种“包”,它将您的实体与 视图所需的所有其他所需信息结合在一起。如果不需要额外的信息,您可以放弃模型并继续直接使用实体。

      但大多数人将这种不良做法称为不良做法。如果您突然需要额外的信息怎么办?您现在必须重写代码才能开始实现模型。

      长话短说:如果您不需要视图中的额外数据,并且您正在处理一个私人项目;做任何你认为最好的事情。从专业角度来说,我建议始终使用模型,以确保您以后可以添加额外的数据。

      【讨论】:

      • 感谢您的评论。因此,您无需在 HTML 代码中硬编码可选国家,而是将 coutries 添加到列表中,然后使用上面的示例向用户显示他的可选国家..?
      【解决方案3】:

      模型代表数据库实体。这些模型不应该负责在视图中显示数据或验证用户输入 - 它们的唯一用途是将数据库中的某些表表示为 c# 对象。

      假设你有模型:

      [Table("Products", Schema = "product")]
      public class Product
      {
          public long Id { get; set; }
          public string Name { get; set; }
          public long CategoryId { get; set; }
          public string Description { get; set; }
          public string ManufacturerUrl { get; set; }
          public string ImageUrl { get; set; }
          public decimal Price { get; set; }
          public int Stock { get; set; }
      
          public Category Category { get; set; }
      }
      

      现在要在您的视图中使用它并添加一些验证,如果您愿意,您应该为它创建一个所谓的ViewModel,它可能是这样的:

      public class ProductViewModel
      {
          public long Id { get; set; }
          public string Name { get; set; }
          public int CategoryId { get; set; }
          [DataType(DataType.MultilineText)]
          public string Description { get; set; }
          [DataType(DataType.Url)]
          [Display(Name = "Producer")]
          public string ManufacturerUrl { get; set; }
          [DataType(DataType.ImageUrl)]
          public string ImageUrl { get; set; }
          [DataType(DataType.Currency)]
          public decimal Price { get; set; }
          [Display(Name = "In stock")]
          public int Stock { get; set; }
      
          public CategoryViewModel Category { get; set; }
      }
      

      【讨论】:

      • 所以每当用户发布一些数据时,它都会被发布到这个模型类中,然后数据被发送到实体中,然后再将其发送到数据库?
      • 我认为这里有一些关于实体和视图模型的好点 - stackoverflow.com/questions/5330172/… 你应该阅读它。
      猜你喜欢
      • 1970-01-01
      • 2011-02-20
      • 2011-07-22
      • 2012-05-17
      • 2013-09-18
      • 1970-01-01
      • 2012-10-18
      • 2014-01-18
      • 2014-08-06
      相关资源
      最近更新 更多