MVC架构-模型和实体

本文关键字:实体 模型 架构 MVC | 更新日期: 2023-09-27 18:01:47

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

在我的项目中,我根本没有模型。我认为实体代表模型,因此为什么我要创建重复的类(而不是看起来很像的实体和模型)。所有的数据注释都在实体类中。我被告知,对SQL server内部表的每一次修改都会抹掉我所有的工作。

我想知道这是真的还是假的,以及为什么当我有实体时,我实际上需要模型。如果需要模型,如何将它们的数据传递到实体中?

编辑:

我发现这篇文章模型和实体之间的差异回答了我的大部分问题。我想知道是否我的整个实体类的注释被擦除,每当我改变一个简单的东西在SQL服务器。为什么模型类不能是实体类的精确副本(除了数据注释之外)?

MVC架构-模型和实体

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

假设你有model:

[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; }
}

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

在视图(编辑现有人员)中,有一个包含国家名称的下拉列表(person需要country实体)。所以,这意味着你需要一个所有可能的国家的列表,以便用户可以选择一个。

你是如何传递国家列表的?

如果你有一个单独的类用作Model,你可以很容易地添加一个新属性,把国家列表放进去,然后从视图中获取它

所以这个例子的视图模型应该是:

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
}

把你的模型想象成一种"包",它把你的实体和视图需要的所有其他所需的信息结合在一起。如果不需要额外的信息,可以放弃模型,继续直接使用实体。

但是大多数人认为这是不好的做法。如果你突然需要额外的信息怎么办?你现在必须重写你的代码来开始实现一个模型。

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

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

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

我建议在您完成了基础知识的学习之后,您继续学习领域驱动开发(DDD)和测试驱动开发(TDD)。到时候你们所有的问题都会得到解答,因为如果我现在用所有的理论来轰炸你们,你们可能会迷失方向,或者认为这比实际情况要困难得多。