2011-11-25 53 views
1

我有一个专门用于编辑常规项目信息(名称,说明,...)的视图。我有另一种视图,专门用于更改附加到项目的图像。将视图模型保存到存储库时会丢失一些数据

这里是一个项目

public class Project 
{ 
    [Key] 
    public int ProjectID   { get; set; } 
    public string Name    { get; set; } 
    public string Description  { get; set; } 
    public string Category   { get; set; } 
    public string Client   { get; set; } 
    public int Year    { get; set; } 
    public byte[] Image    { get; set; } 
    public string FileName   { get; set; } 
    public int FileLength  { get; set; } 
    public string FileType   { get; set; } 
} 

这里的基本模型是用于编辑基本项目的相关信息

public class ProjectViewModel 
{ 
    public int ProjectID  { get; set; } 
    public string Name   { get; set; } 
    public string Description { get; set; } 
    public string Category  { get; set; } 
    public string Client  { get; set; } 
    public int Year   { get; set; } 
} 

这里视图模型被用于改变连接到项目

图像视图模型
public class UploadImageViewModel 
{ 
    public int  ProjectID { get; set; } 
    public byte[] Image  { get; set; } 
    public string FileName { get; set; } 
    public int  FileLength { get; set; } 
    public string FileType { get; set; } 
} 

到目前为止好。当我通过我的视图编辑项目(第一个编辑基本信息)并提交更改时,出现问题。然后在控制器中的动作被触发并执行以下代码:

[HttpPost] 
    public ActionResult EditProject(ProjectViewModel viewModel) 
    { 
     if (!ModelState.IsValid) 
      return View(); 

     // Map viewModel into model 
     Project model = Mapper.Map<ProjectViewModel, Project>(viewModel); 

     m_AdminService.SaveProject(model); 

     return RedirectToAction("ListProjects"); 
    } 

正如你所看到的,我视图模型映射在项目模型,然后我保存这个对象。

这里是在仓库中执行的代码

public void SaveProject(Project project) 
    { 
     if (project.ProjectID == 0) 
     { 
      m_Context.Projects.Add(project); 
     } 
     else 
     { 
      var entry = m_Context.Entry(project); 
      entry.State = EntityState.Modified; 
     } 

     m_Context.SaveChanges(); 
    } 

的问题是,如果我以前有附加到项目存储库中的图像,然后我的形象在此过程中,因为传递的对象丢失到存储库没有任何图像内容。

你明白我的意思了吗?我该如何解决这个问题?

我喜欢观看只包含必要信息的模型。将这些部分信息保存到原始对象而不丢失数据时会发生问题。

谢谢。

回答

1

我建议你先拉从数据库中project条目,然后从应用视图模型的变化,然后保存结果:

Project model = m_AdminService.LoadProject(viewModel.ProjectID); 

Mapper.Map<ProjectViewModel, Project>(target: model, source: viewModel); 
// I'm not sure how the mapper works, you may have to write other code instead 

m_AdminService.SaveProject(model); 
+0

可惜,这是行不通的。在注入数据之前,automapper会清除目标对象中的所有内容。所以即使我先从数据库中取出项目,它也会被automapper清除。 – Bronzato

+0

也许切换到另一个映射器是可行的吗? – Zruty

+0

最后,上面的解决方案工作。谢谢。 – Bronzato