2011-11-25 2 views
1

J'ai une vue spécialement conçue pour éditer les infos générales du projet (nom, description, ...). J'ai une autre vue spécialement conçue pour changer l'image attachée à un projet.Quelques données perdues lors de la sauvegarde (à partir de) voir les modèles dans le référentiel

Voici le modèle de base d'un projet

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; } 
} 

Voici le modèle de vue pour l'édition projet de base infos

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; } 
} 

Voici le modèle de vue pour changer l'image attachée à un projet

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; } 
} 

Jusqu'ici tout va bien. Le problème s'est produit lorsque j'ai édité un projet à travers ma vue (le premier pour éditer les infos de base) et soumettre des changements. Ensuite, l'action dans le contrôleur est déclenché et le code suivant est exécuté:

[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"); 
    } 

Comme vous pouvez le voir, je mapper le modèle de vue dans un modèle de projet, puis-je enregistrer cet objet.

Et voici le code exécuté dans le référentiel

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(); 
    } 

Le problème est que si j'avais déjà une image attachée au projet dans le référentiel, puis mon image est perdue au cours de ce processus parce que l'objet est passé au référentiel n'a pas contenu d'image.

Voyez-vous ce que je veux dire? Comment dois-je gérer ce problème?

J'aime l'idée d'avoir des modèles de vue contenant seulement les informations nécessaires. Le problème se produit lors de la sauvegarde de ces informations partielles sur l'objet d'origine sans perte de données.

Merci.

Répondre

1

Je vous suggère de tirer la première entrée de la base de données project, puis d'appliquer les changements de modèle de vue, puis sauvegarder le résultat:

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

Malheureusement, cela ne fonctionne pas. L'automapper efface tout dans l'objet de destination avant d'y injecter des données. Donc, même si je tire d'abord le projet de la base de données, il est effacé par l'automapper. – Bronzato

+0

Peut-être est-il viable de passer à un autre mappeur? – Zruty

+0

Enfin la solution ci-dessus fonctionne. Merci. – Bronzato

Questions connexes