Model view controller 自动映射问题-如果我从视图中删除属性,但不从viewmodel中删除,该怎么办?

Model view controller 自动映射问题-如果我从视图中删除属性,但不从viewmodel中删除,该怎么办?,model-view-controller,viewmodel,automapper,Model View Controller,Viewmodel,Automapper,我刚刚开始在MVC ASP.NET项目中使用AutoMapper将域模型映射到视图模型。例如 public class PersonModel { public string FirstName { get; set; } public string NickName { get; set; } public string LastName { get; set; } public DateTime BirthDate { get; set; } } pu

我刚刚开始在MVC ASP.NET项目中使用AutoMapper将域模型映射到视图模型。例如

public class PersonModel
{
    public string FirstName { get; set; }

    public string NickName { get; set; }

    public string LastName { get; set; }

    public DateTime BirthDate { get; set; }
}

public class PersonViewModel
{
    public string FirstName { get; set; }

    public string NickName { get; set; }

    public string LastName { get; set; }

    public DateTime BirthDate { get; set; }
}

// Somewhere...
Mapper.CreateMap<PersonModel, PersonViewModel>();
Mapper.CreateMap<PersonViewModel, PersonModel>();
公共类PersonModel
{
公共字符串名{get;set;}
公共字符串昵称{get;set;}
公共字符串LastName{get;set;}
公共日期时间出生日期{get;set;}
}
公共类PersonViewModel
{
公共字符串名{get;set;}
公共字符串昵称{get;set;}
公共字符串LastName{get;set;}
公共日期时间出生日期{get;set;}
}
//某处。。。
CreateMap();
CreateMap();
采用这种模式后,我担心未来会发生以下情况:

1) 开发人员创建一个Person视图,该视图显示所有4x属性的编辑器

2) 开发人员B随后从Person视图中删除“昵称”编辑器,但保留在PersonViewModel中

3) 由于昵称值从不保留在视图中,因此在保存时提交,因此Automapper开始从PersonViewModel->PersonModel映射“昵称”的空值,并在没有任何运行时或编译时警告的情况下覆盖数据


这是一个合法的风险吗?您遇到过吗?您是如何处理的?

您可以通过服务器端验证和自动端到端测试来减轻此类风险


因此,在您的示例中,其中一个测试是“在保存某人时,昵称应包含一个值”。

问题是如何以通用、全局的方式降低此风险,而不必为每个字段手动编写代码。如果必须逐个字段手动编码,那么使用Automapper是没有意义的。如果没有服务器端验证,服务器端代码如何知道空值是合法的或不合法的?您提到的场景会发生在任何类型的映射(手动或自动)中,因此更重要的是有一个好的测试套件,而不是映射问题。可能输入了一个合法的空值。。。。所以空值本身不是问题。问题是,开发人员只需从视图中删除一个字段,就可以轻易地破坏数据——除了6个月后的错误报告之外,没有任何指示。