Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 如何为简单数据库建模和ViewModel实现_Asp.net Mvc_Oop - Fatal编程技术网

Asp.net mvc 如何为简单数据库建模和ViewModel实现

Asp.net mvc 如何为简单数据库建模和ViewModel实现,asp.net-mvc,oop,Asp.net Mvc,Oop,我正在尝试Microsoft ASP.Net MVC的第一步。我建立了一个简单的数据库,可以测试所有方面,如控制器、视图、模型、视图模型等 背后的理由是拥有简单的项目和资源。每个项目可以有多个资源。分配给项目的每个资源都可以有一个角色(字符串) 我的数据库模型如下所示: Projects Id <int> Name <string> CreatedAt <datetime> CreatedBy <string> R

我正在尝试Microsoft ASP.Net MVC的第一步。我建立了一个简单的数据库,可以测试所有方面,如控制器、视图、模型、视图模型等

背后的理由是拥有简单的项目和资源。每个项目可以有多个资源。分配给项目的每个资源都可以有一个角色(字符串)

我的数据库模型如下所示:

Projects
    Id <int>
    Name <string>
    CreatedAt <datetime>
    CreatedBy <string>

Resource
    Id <int>
    Name <string>
    CreatedAt <datetime>
    CreatedBy <string>

ProjectResources
    Id <int>
    ProjectId <int>
    ResourceId <int> 
    Role <string>
    CreatedAt <datetime>
    CreatedBy <string>
public class Project
{
    public int Id { get; set; }
    public string  Name { get; set; }
    // IS THIS CORRECT? WHERE DO I HAVE TO PUT THE ROLE?
    public List<Resource> Resources { get; set; }
    public string  CreatedBy { get; }
    public datetime  CreatedAt { get; }
}

public class Resource
{
    public int Id { get; set; }
    public string  Name { get; set; }
    public string  CreatedBy { get; }
    public datetime  CreatedAt { get; }
}
项目
身份证件
名称
创建数据
创造的
资源
身份证件
名称
创建数据
创造的
项目资源
身份证件
投射
足智多谋的
角色
创建数据
创造的
第一件事是在解决方案中构建EntityClass。我可以这样做:

Projects
    Id <int>
    Name <string>
    CreatedAt <datetime>
    CreatedBy <string>

Resource
    Id <int>
    Name <string>
    CreatedAt <datetime>
    CreatedBy <string>

ProjectResources
    Id <int>
    ProjectId <int>
    ResourceId <int> 
    Role <string>
    CreatedAt <datetime>
    CreatedBy <string>
public class Project
{
    public int Id { get; set; }
    public string  Name { get; set; }
    // IS THIS CORRECT? WHERE DO I HAVE TO PUT THE ROLE?
    public List<Resource> Resources { get; set; }
    public string  CreatedBy { get; }
    public datetime  CreatedAt { get; }
}

public class Resource
{
    public int Id { get; set; }
    public string  Name { get; set; }
    public string  CreatedBy { get; }
    public datetime  CreatedAt { get; }
}
公共类项目
{
公共int Id{get;set;}
公共字符串名称{get;set;}
//这是正确的吗?我应该把角色放在哪里?
公共列表资源{get;set;}
由{get;}创建的公共字符串
public datetime CreatedAt{get;}
}
公共类资源
{
公共int Id{get;set;}
公共字符串名称{get;set;}
由{get;}创建的公共字符串
public datetime CreatedAt{get;}
}
这是问题的第一部分。第二部分是ViewModels。我读到的是,ViewModels应该只包含在视图上呈现的信息。当我有3个不同的视图用于2个不同的目的时,例如:

  • 获取项目列表
  • 使用分配的资源获取单个项目
  • 使用分配的资源保存(编辑/更新和新建)项目
所以问题是:ViewModel看起来如何?我是否需要有多个ViewModels(据我了解是)?我已经考虑过了,但不知道这是否合适(ViewModels是否也有NamingConvention):

项目视图模型的公共类列表
{
列出项目{get;set;}
}
但在这种情况下,连接的资源放在何处以及如何放置

public class ProjectDetailViewModel
{
    Project project { get; set; }
    List<Resource> resources { get; set; }
}
公共类ProjectDetailViewModel
{
项目{get;set;}
列表资源{get;set;}
}

在ProjectDetailViewModel类中,我会有下拉列表中的资源列表,但是每个项目添加/选择的资源和选择的资源角色放在哪里?

如果一个项目可以有多个资源,然后
Project
将具有
Resource
列表的导航属性,
Resource
将具有单个
项目的导航属性。当然,这是假设一个资源可以位于单个项目上。否则,它将是一个多对多关系,并且您将在两侧都有一个
列表
导航属性

现在角色:根据您的需要,如果
资源
可以有多个角色,并且角色显然有多个资源,那么两边都是多对多的
列表

此外,还需要(外键)的简单属性,以便数据库可以强制执行这些属性。此外,在某些情况下,您只加载
资源
,而不加载其
角色
(导航属性),因此需要
角色ID

至于ViewModels:

    public class ListOfProjectsViewModel
    {
        List<Project> projects { get; set; }
    }
正如我所说,我不想开始这场辩论,MVC中没有ViewModel。这就是视图具有模型属性的原因。因此,无论你传递给它什么,都是模型。这就是为什么会有一个模型文件夹

根据编辑、创建、列表(将显示x个项目的列表)等操作命名视图。您的
资源将需要以下结构:

观点:

资源 -编辑 -创造 -名单

型号:

资源 -编辑模型(ResourceEditModel) -创建模型 -列表模型

您的ListModel可能具有诸如
Total
PageNumber
等属性,并且您的
EditModel
可能具有用于下拉选择和其他项目的
项目列表。这很正常。因此,您有视图的模型,然后有数据库的模型,甚至可能有域模型


很明显,你会有控制器。一旦开始在客户端使用绑定、错误处理和验证,您将需要ViewModels,但此时您正处于MVVM的操场上。

视图模型不应包含属于数据模型的属性-@Stephen这是正确的。我知道这一点,因此我们的目的是使用经典模型,它是数据库模型/业务对象的表示,而viewmodels只包含用于在视图上呈现这些信息的信息。我的问题不是viewmodel应该包含什么,而是我想知道如何处理连接的资源。例如,MVC(模型、视图、控制器)中没有viewmodel,所以我不确定为什么人们认为传递给视图的东西是viewmodel。它是一个模型。@CodingYoshi-所以它在数据模型和视图模型之间是有区别的:)视图有一个名为model的属性,所以传递给它的任何内容都是一个模型。如果在浏览器端使用KnockoutJs,ViewModel将发挥作用。ViewModels应该是交互式和声明性的,并且有方法、处理程序、绑定等。但是,是的,我明白你的意思,很多人都这么认为,但这是不正确的。