正确将视图模型映射到实体

ama*_*man 2 c# asp.net-mvc entity-framework

我的实体为:

public class User
{
    public int Id { get; set; }

    public string Name { get; set; }

public string Address { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我有我的UserViewModel作为

public class UserViewModel 
{
    public int Id { get; set; }

    public string Name { get; set; }

    public string Address { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我在控制器中如下使用这些:

//This is called from my view via ajax
 public void Save(UserViewModel uv)
 {
    // this throws error: cannot convert from UserViewModel to Entity.User
    MyRepository.UpdateUser(uv);
 }
Run Code Online (Sandbox Code Playgroud)

我在存储库类中的UpdateUser如下所示:

  public void UpdateUser(User u)
  {        
   var user = GetUserDetails(u.Id);

    user.Name = u.Name;
    user.Address = u.Address;

   //using entity framework to save
  _context.SaveChanges();
  }
Run Code Online (Sandbox Code Playgroud)

如何将控制器中的UserViewModel正确映射到我的实体

Ari*_*ria 5

通过使用AutoMapper,您可以执行以下操作:

 public void Save(UserViewModel uv)
 {
    // this throws error: cannot convert from UserViewModel to Entity.User
   var config = new MapperConfiguration(cfg => {

                cfg.CreateMap<UserViewModel , User>();

            });
    User u = config.CreateMapper().Map<User>(uv);
    MyRepository.UpdateUser(u);
 }
Run Code Online (Sandbox Code Playgroud)

或手动:

 public void Save(UserViewModel uv)
 {
    User u = new User()
      {
        Id = uv.Id
        Name = uv.Name;
        Address = uv.Address;
      };
    MyRepository.UpdateUser(u);
 }
Run Code Online (Sandbox Code Playgroud)

如果您更改视图模型和模型,则手动执行此操作不是很好,那么您也应该更改代码,但是Automapper不需要更改代码。

编辑1:

这不是好主意,利用模型-视图存储库(数据访问核心),所以它会更好,让您public void UpdateUser(User u)和不改变它,在外面是更好地传递userUpdateUserUserViewModel喜欢你以前做过什么。

编辑2:

我认为没有回答的帖子甚至与我的SOC(关注分离)都不相关...

1-当我通过时,UserViewModel我违反了SOC ....

2-另一方面,如果我直接在“ Persentationation”层中有“用户”,我也违反了SOC。

我认为最好的方法是将中间层用作代理。

演示<---->代理<---->存储库。