Asp.net mvc 如何为简单数据库建模和ViewModel实现
我正在尝试Microsoft ASP.Net MVC的第一步。我建立了一个简单的数据库,可以测试所有方面,如控制器、视图、模型、视图模型等 背后的理由是拥有简单的项目和资源。每个项目可以有多个资源。分配给项目的每个资源都可以有一个角色(字符串) 我的数据库模型如下所示: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
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个不同的目的时,例如:
- 获取项目列表
- 使用分配的资源获取单个项目
- 使用分配的资源保存(编辑/更新和新建)项目
项目视图模型的公共类列表
{
列出项目{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应该是交互式和声明性的,并且有方法、处理程序、绑定等。但是,是的,我明白你的意思,很多人都这么认为,但这是不正确的。