如何为简单数据库建模和ViewModel实现

时间:2016-12-17 10:14:38

标签: asp.net-mvc oop

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

背后的情况是拥有简单的项目和资源。每个项目可以有多个资源。每个为项目分配的资源都可以具有角色(字符串)。

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

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>

首先要在解决方案中构建EntityClasses。我可以这样:

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

这是问题的第一部分。第二部分是ViewModels。我读过的是,ViewModels应该只包含那些在视图上呈现的信息。当我有2个不同目的的3个不同视图时,例如:

  • 获取项目列表
  • 获取具有指定资源的单个项目
  • 使用指定的资源保存(编辑/更新和创建新项目)

所以问题是:ViewModel看起来怎么样?我需要有多个ViewModel(根据我的理解是)?我已经考虑过了,但不知道这是否正常(是否还有ViewModels的NamingConvention):

    public class ListOfProjectsViewModel
    {
        List<Project> projects { get; set; }
    }

但在这种情况下,何处以及如何放入已加入的资源?

public class ProjectDetailViewModel
{
    Project project { get; set; }
    List<Resource> resources { get; set; }
}

在ProjectDetailViewModel类中,我将获得下拉列表的资源列表,但是每个项目添加/选择的资源和所选资源角色的位置在哪里?

1 个答案:

答案 0 :(得分:0)

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

现在角色:根据您的需要,如果Resource可以拥有多个角色,而且角色显然拥有多个资源,那么双方都需要多对多List<T>

此外,您将需要(外键)的简单属性,以便它们可以由数据库强制执行。此外,有些情况下您只需加载Resource而不加载其Role(导航属性),因此您需要RoleId

至于ViewModels:

就像我说的,我不想开始这场辩论,MVC中没有ViewModel。这就是View具有Model属性的原因。所以无论你传递给它的是模型。这就是模型文件夹的原因。

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

查看:

资源     - 编辑    - 创建     - 列表

型号:

资源      - EditModel或(ResourceEditModel)      - CreateModel      - ListModel

您的ListModel可能包含TotalPageNumber等属性,而您的EditModel可能会有一个Project列表,用于下拉列表选择和其他项目。这一切都很正常。所以你有你的视图模型,然后你有你的数据库的模型,你甚至可能有域模型。

显然你会有控制器。一旦开始在客户端使用绑定,错误处理和验证,您将需要ViewModels,但此时您将进入MVVM游乐场。