在 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)。这带来了额外的优势,例如更好的可测试性,因为您现在不依赖于特定的数据存储来创建模型实例。
我正在为我的 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)。这带来了额外的优势,例如更好的可测试性,因为您现在不依赖于特定的数据存储来创建模型实例。