将视图模型保存(从视图模型开始)到存储库时,某些数据会丢失

时间:2011-11-25 11:49:46

标签: asp.net-mvc

我有一个专门用于编辑一般项目信息(名称,描述,......)的视图。我有另一种视图,专门用于更改附加到项目的图像。

这是项目的基本模型

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 个答案:

答案 0 :(得分: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);