在 ASP.MVC 中为视图模型派生数据库模型

Deriving a database model for view model in ASP.MVC

我正在为我的 ASP MVC 网络应用程序创建一些视图模型。 我为数据库创建了 "code first" 模型。从数据库模型中导出视图模型是一种好方法吗?

示例数据库模型:

public class Project
{
    [Key]
    public int Id { get; set; }
    public int? CustomerId { get; set; }   
    public int TypeId { get; set; }   
    public string Number { get; set; }  
    public string Name { get; set; }
}

查看模型:

public class ViewModelProject : Project
{
    [NotMapped]
    public DateTime? Start { get; set; }
    [NotMapped]
    public DateTime? End { get; set; }
    [NotMapped]
    public string Manager { get; set; }
}

这是正确的方法还是完全错误的?

编辑(子问题): 我有一些非常简单的数据库模型,比如 ProjectType,它只包含两个属性。我是否也应该在模型视图中分割这些模型,或者我可以那样做: 简单数据库模型:

public class ProjectType
{
    [Key]        
    public int Id { get; set; }    
    public string Name { get; set; }
    public int? Code { get; set; } 
}

我可以这样使用吗:

public class ProjectVM
{
    public string Name { get; set; }
    public int Number { get; set; }
    public ProjectType Type { get; set; }
}

还是必须像这样分片:

public class ProjectVM

    {
        public string Name { get; set; }
        public int Number { get; set; }
        public string Type { get; set; }
        public int TypeCode { get; set; }
    }

我不建议这样做。我(和许多其他人)已经尝试过,但效果不佳。您会在不经意间 运行 陷入麻烦,因为 MVC 模型必须针对视图进行定制,而您从数据库中获得的内容很少适合。当然,您可以将其敲定到位,但代码很快就会变得混乱并且与存储相关,并且 UI 代码开始混乱在一起。这甚至显示在您的示例中,因为您必须将 NotMappedAttribute(与数据存储相关)放置到 ViewModelProject(UI 级别的 class)。

还有许多其他示例可以说明此问题,但当您想要将模型对象序列化为 JSON 并将其发送到 JavaScript 客户端时,我发现了一个特别好的例子。 JSON 序列化程序获取所有 public 属性的值并将它们添加到 JSON。如果你想排除 属性,你必须用 ScriptIgnoreAttribute 标记它,你还必须将它应用到基础 class,这打破了 UI 之间的分离和商店相关的代码。

更好的方法是将存储模型和 MVC 模型分开,并将数据从一个模型映射到另一个模型(已经有预先存在的框架可以帮助您实现这一点,例如 Automapper)。这带来了额外的优势,例如更好的可测试性,因为您现在不依赖于特定的数据存储来创建模型实例。