【问题标题】:Deriving a database model for view model in ASP.MVC在 ASP.MVC 中为视图模型派生数据库模型
【发布时间】:2017-09-13 06:58:18
【问题描述】:

我正在为我的 ASP MVC Web 应用程序创建一些视图模型。 我为数据库创建了“代码优先”模型。从数据库模型派生视图模型是一种好方法吗?

示例数据库模型:

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

【问题讨论】:

  • 不,这不是正确的方式 - What is ViewModel in MVC?
  • 我认为完全错误。视图模型应该与数据模型相关联——甚至不是所有的数据模型字段都包括在内(取决于您使用的视图页面)。
  • 但有时像这样使用它似乎很简单。所以我每次都需要将每个模型“重写”为 Viewmodel?
  • 使用视图模型的目的包括关注点分离、防止过度发布和发布不足攻击、添加不适合数据模型的视图特定属性等的能力 - 你所做的事情违背了目的.征求意见是题外话。
  • “子问题”与原始问题无关。您应该为此打开一个新的问答。

标签: c# asp.net asp.net-mvc asp.net-mvc-4


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 2015-10-23
    相关资源
    最近更新 更多