我有一个专门用于编辑一般项目信息(名称,描述,......)的视图。我有另一种视图,专门用于更改附加到项目的图像。
这是项目的基本模型
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();
}
问题是,如果我以前在存储库中附加了项目的图像,那么在此过程中我的图像会丢失,因为传递给存储库的对象不会对任何图像进行任何内容。
你明白我的意思吗?我该如何处理这个问题?
我喜欢只包含必要信息的视图模型的想法。将这些部分信息保存到原始对象而不丢失数据时会出现问题。
感谢。
答案 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);