MVC架构 - 模型和实体

时间:2014-05-05 09:46:29

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

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

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

我想知道它是否真实,以及为什么我实际上需要模型而不是实体。 如果需要模型,你如何实际将数据传递给实体?

修改 我发现这篇文章Difference between model and entity回答了我的大部分问题。 我想知道每当我在SQL服务器中更改一个简单的东西时,我的整个实体类的注释是否都会被删除。 为什么模型类不是实体类的精确副本(除了数据注释)?

3 个答案:

答案 0 :(得分:0)

模型代表数据库实体。这些模型不应负责在视图中显示数据或验证用户输入 - 它们的唯一用途是将数据库中的某些表表示为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; }
}

答案 1 :(得分:0)

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

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

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

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

所以这个例子的viewmodel将是:

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
}

将您的模型视为一种&#39;套餐&#39;它将您的实体与视图所需的所有其他所需信息组合在一起。如果不需要额外的信息,您可以放弃模型并继续直接使用实体。

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

长话短说:如果您不需要在视图中添加额外数据,那么您正在处理私有项目;做你认为最好的事情。在专业方面,我建议总是使用模型,如果只是为了确保你可以将来添加额外的数据。

答案 2 :(得分:0)

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

如果您使用部分类并将业务规则放在那里,您实际上可能会丢失模型层,但是拥有模型层的重点是为模型编写单元测试比实体更简单。

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

相关问题