2017-09-14 1 views
0

J'ai une application MVC en utilisant Entity Framework. Une partie de l'application implique la création de rapports qui peuvent être enregistrés dans la base de données. Cela implique également de charger ces rapports à partir de la base de données, de les modifier et de sauvegarder les modifications dans la base de données. Une chose que j'ai remarquée est que lorsque je sauvegarde un rapport, les modifications sont conservées dans la base de données, mais si je recharge ce rapport, les modifications ne sont pas présentes. Évidemment, Entity Framework ne met pas à jour les rapports de la base de données. Je me demande comment forcer Entity Framework à reconnaître quand un rapport est ancien ou quand il doit obtenir la version la plus à jour d'un rapport de la base de données.Obtention d'Entity Framework pour obtenir l'entité de la base de données lors de la mise à jour

Voilà comment fonctionne le flux de processus:

1) Des modifications sont apportées au rapport sur la page de configuration du rapport, et le bouton « Enregistrer » est cliqué.

2) Les données du rapport sont envoyées via un appel AJAX au ReportConfigController. Les modifications sont écrites dans l'entité de rapport.

3) Un appel à _projectService.UpdateProjectForReport (projet) est effectué en passant dans le projet auquel appartient le rapport (c'est-à-dire que project.Reports est une ICollection qui inclut le rapport mis à jour).

4) UpdateProjectForReport() ressemble à ceci:

public void UpdateProjectForReport(Project project) 
    { 
     _context.SaveChanges(); 
    } 

5) En regardant la base de données, je vérifie que les changements ont été persisté.

6) Je m'éloigne de la page de configuration du rapport et je reviens.

7) Je sélectionne le rapport que je viens de mettre à jour dans un menu déroulant. Cela déclenche un appel AJAX pour charger le rapport.

8) Le ReportConfigController effectue un appel API pour obtenir le rapport, en transmettant l'ID du projet et l'ID du rapport.

9) L'API obtient le rapport comme suit:

_project = _projectService.GetProject (projectId); Rapport de rapport = _project.Report.Where (r => r.ReportId == reportId) .FirstOrDefault();

... où _project.Report est une ICollection.

10) _projectService.GetProject() ressemble à ceci:.

publique Projet getProject (int projectId)

{ _context.Projects.Include de retour ("Rapport") FirstOrDefault (p => p .ProjectId == projectId);

}

11) Le rapport est converti en JSON et retourné.

C'est aux étapes 9) et 10) que j'ai besoin d'Entity Framework pour reconnaître qu'il doit obtenir les rapports les plus à jour pour le projet. Ce n'est pas le cas.

Quelqu'un peut-il m'aider avec ça?

Répondre

0

Pourriez-vous poster votre classe Report? Quoi qu'il en soit, je suppose que vous devriez simplement quelque chose comme ceci:

; Report report = _project.Report.Where(r => r.ReportId == reportId).OrderByDescending(r => r.LastUpdateDateTime).FirstOrDefault(); 
+0

Modifié ma réponse. Cela résout-il votre question? – Massimo

0

rapport ressemble à ceci:

Ma classe de rapport ressemble à ceci: Rapport public partial class { [System.Diagnostics.CodeAnalysis.SuppressMessage ("Microsoft.Usage", "CA2214: DoNotCallOverridableMethodsInConstructors")] public Report() { this.ReportComment = new HashSet(); this.ReportMetric = new HashSet(); this.ReportTopN = new HashSet(); }

public int ReportId { get; set; } 
    public string GUID { get; set; } 
    public int ProjectId { get; set; } 
    public string UserFriendlyProjectName { get; set; } 
    public string EquipmentType { get; set; } 
    public string EquipmentTypeJustification { get; set; } 
    public string LastUpdateUser { get; set; } 
    public System.DateTime LastUpdateDateTime { get; set; } 
    public string InsertUser { get; set; } 
    public System.DateTime InsertDateTime { get; set; } 
    public Nullable<bool> Bowties { get; set; } 
    public Nullable<bool> AllDataSafeguards { get; set; } 
    public string FacilityComparisonFile { get; set; } 

    public virtual Project Project { get; set; } 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
    public virtual ICollection<ReportComment> ReportComment { get; set; } 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
    public virtual ICollection<ReportMetric> ReportMetric { get; set; } 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
    public virtual ICollection<ReportTopN> ReportTopN { get; set; } 
}