2017-09-14 2 views
0

Ich habe eine MVC-Anwendung mit Entity Framework. Ein Teil der Anwendung umfasst das Erstellen von Berichten, die in der Datenbank gespeichert werden können. Sie müssen diese Berichte auch aus der Datenbank laden, ändern und die Änderungen in der Datenbank speichern.Entity Framework zum Abrufen der Entität aus der Datenbank bei der Aktualisierung abrufen

Eine Sache, die ich bemerkte, ist, dass wenn ich einen Bericht speichern, die Änderungen in der Datenbank beibehalten werden, aber wenn ich diesen Bericht neu lade, sind die Änderungen nicht da. Offensichtlich aktualisiert Entity Framework die Berichte nicht von der Datenbank. Ich frage mich, wie Entity Framework erzwungen wird, um zu erkennen, wenn ein Bericht alt ist oder wenn er die aktuellste Version eines Berichts aus der Datenbank abrufen muss.

Hier ist, wie der Prozessablauf funktioniert:

1) Änderungen an dem Bericht über den Bericht Konfigurationsseite vorgenommen werden, und die Schaltfläche „Speichern“ geklickt wird.

2) Die Berichtsdaten werden über einen AJAX-Aufruf an den ReportConfigController gesendet. Die Änderungen werden in den Bericht Entität geschrieben.

3) Ein Aufruf von _projectService.UpdateProjectForReport (Projekt) wird in dem Projekt ausgeführt, zu dem der Bericht gehört (d. H. Project.Reports ist eine ICollection, die den aktualisierten Bericht enthält).

4) UpdateProjectForReport() sieht wie folgt aus:

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

5) in der Datenbank der Suche, ich überprüfen, ob die Änderungen beibehalten wurden.

6) Ich navigiere von der Berichtkonfigurationsseite weg und ich komme zurück.

7) Ich wähle den Bericht, den ich gerade aktualisiert habe, aus einem Dropdown-Menü aus. Dies löst einen AJAX-Aufruf aus, um den Bericht zu laden.

8) Der ReportConfigController führt einen API-Aufruf zum Abrufen des Berichts aus, wobei die Projekt-ID und die Berichts-ID übergeben werden.

9) Die API ruft den Bericht wie folgt:

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

... wobei _project.Report eine ICollection ist.

10) _projectService.GetProject() sieht wie folgt aus:.

öffentliches Projekt getProject (int projectId)

{ return _context.Projects.Include ("Report") FirstOrDefault (p => p .ProjectId == projectId);

}

11) Der Bericht wird json umgewandelt und zurückgegeben.

In den Schritten 9) und 10) muss Entity Framework erkennen, dass es die aktuellsten Berichte für das Projekt benötigt. Es tut es nicht.

Kann mir jemand dabei helfen?

Antwort

0

Könnten Sie Ihren Bericht Klasse posten? Wie auch immer ich nehme an, Sie sollten nur so etwas tun:

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

meine Antwort Modified. Löst es deine Frage? – Massimo

0

Bericht wie folgt aussieht:

Mein Bericht Klasse sieht wie folgt aus: public partial class Bericht { [System.Diagnostics.CodeAnalysis.SuppressMessage ("Microsoft.Usage", "CA2214: DoNotCallOverridableMethodsInConstructors")] öffentlicher 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; } 
} 
Verwandte Themen