实体框架和与MVC的关系

use*_*986 8 c# asp.net-mvc entity-framework

我试图了解整个MVC/EF关系.如果我创建一个只与数据库交互的实体模型(因为你不应该将实体模型传递给视图),那么Model的类,最后是一个视图模型,如下所示.我唯一的问题是拥有第二个类似乎是多余的,我看到的例子中唯一不同的是它们将数据注释应用于该类,因为它与视图交互.为什么确保实体对象不暴露在视图层是如此重要?

我还没有开始编写项目,但是我假设您将使用Entity模型与数据库进行交互,然后将其转换为ProductModel以传递给视图,这是正确的逻辑吗?

实体模型:

public class Product 
{
    [Key()]
    public int ID { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public double Price { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

模型:

public class ProductModel
{
    public int ID { get; set; }
    [StringLength(50)]
    [Required(ErrorMessage = "Product Name is required.")]
    [Display(Name = "Product Name")]
    public string Name { get; set; }
    public string Description { get; set; }
    public double Price { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

视图模型:

public class ProductViewModel
{
    Product myProduct { get; set; }\
    //Plus any other properties I may need for the view.
}
Run Code Online (Sandbox Code Playgroud)

更新:

在我一直在阅读的例子中,他们也有一个DBContext设置如下.那么ProductModel类是否无用呢?

public class MyAppContext : DbContext
{
    public MyAppContext()
        : base("name=DBConnection")
    { 
    }

    public DbSet<Product> Products { get; set; }

 }
Run Code Online (Sandbox Code Playgroud)

cad*_*ll0 1

我创建与实体分开的模型类有两个主要原因。

  1. 正如您提到的,属性。您可能希望在多个应用程序中重用您的实体,并且它们可能不使用相同的属性。您不想用这些污染您的实体。

  2. 根据它们的 ORM,您的实体可能需要一个基类。或者可能存在必须应用于实体的属性或其他自定义。这可能会导致测试业务逻辑时出现困难。此外,如果您更改 ORM 或 ORM 中的某些内容发生更改,您将将该更改与应用程序的其余部分隔离。

基本上,您正在隔离应用程序的不同层并保护一层免受另一层所做的更改的影响。