2016-07-07 2 views
1

Ich habe 3 Modelle:Strukturieren von Modellen in einer einfachen Hierarchie in MVC, was ist die beste Vorgehensweise?

Projekte

public int ProjectID { get; set; } 
public string Description { get; set; } 
public string UserID { get; set; } 
[ForeignKey("UserID")] 
public virtual ApplicationUser User { get; set; } 

public virtual ICollection<Job> Jobs { get; set; } 

Jobs

public int JobID { get; set; } 
    public int ProjectID { get; set; } 
    public string Title { get; set; } 
    public string Jobdescription { get; set; } 
    public string UserID { get; set; } 
    [ForeignKey("UserID")] 
    public virtual ApplicationUser User { get; set; } 

    public virtual Project Projects { get; set; } 
    public virtual ICollection<Log> Logs { get; set; } 
    public virtual ICollection<Assignment> Assignments { get; set; } 

Logs

public int LogID { get; set; } 
    public int JobID { get; set; } 
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd HH:mm}")] 
    public DateTime Logstart { get; set; } 
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd HH:mm}")] 
    public DateTime Logend { get; set; } 
    public int totaltime { get; set; } 
    public string Notes { get; set; } 
    public string UserID { get; set; } 
    [ForeignKey("UserID")] 
    public virtual ApplicationUser User { get; set; } 
    public virtual Job Job { get; set; } 

ich zum Beispiel in meinen Projekten Index sehen eine Summe haben möchte Alle 'Totaltime' für alle Protokolle für jedes Projekt. In meinem Job Index-Seite kann ich einfach das tun, indem diese Summen innerhalb einer foreach-Schleife wie folgt meiner Ansicht nach Summieren:

@TimeSpan.FromMinutes(item.Logs.Sum(i => i.totaltime)) 

aber ich weiß nicht, wie die gleiche Sache auf meinen Projekte Seite zu tun, ohne entweder die Schaffung ein Viewmodel oder Hinzufügen des ProjectID-Schlüssels zum Logs-Modell, so dass ich das oben genannte für Projekte auf der Indexseite des Projekts tun kann.

kann ich den Wert totaltime für den ersten Job jedes Projekts bekommen dies mit:

@TimeSpan.FromMinutes(item.Jobs.Sum(i => i.Logs.First().totaltime)) 

aber ich weiß nicht, wie ich das schreiben kann, für jeden Auftrag alle ‚totaltimes‘ zu summieren.

Was ich gerne wissen würde, ist, was der beste Weg ist, dies zu tun. Muss ich ein Viewmodel erstellen oder eine Beziehung zum Projektmodell in meinem Protokollmodell hinzufügen, in der Art und Weise, in der sich das Projektmodell auf das Jobmodell bezieht? Gibt es Nachteile oder Probleme mit einer dieser Methoden, die ich vermisse? Sicherlich gibt es einen einfachen Weg für mich, die "Gesamtzeit" für ein Projekt zu erreichen, indem ich etwas benutze, das ich oben verwende.

Ich bin wie Sie in der Lage zu sagen, nur versuchen MVC langsam zu lernen. Vielen Dank.

+4

Sie sollten ein Ansichtsmodell werden mit dem Endzustand der Informationen, die Sie in der Ansicht wollen darstellen präsentieren, sollten Sie nicht direkt zu der Ansicht EF Entitäten zu binden versuchen, . –

+0

Danke für deinen Kommentar, ich benutze ein Viewmodel. – Rob

Antwort

1

Sie müssen kein Ansichtsmodell verwenden, aber ich würde es wahrscheinlich empfehlen. Ich bevorzuge es, meine gesamte Verarbeitung außerhalb der Ansicht durchzuführen, also würde ich die Berechnung im Controller durchführen und die Gesamtzeit einer Eigenschaft im Ansichtsmodell zuweisen. Aber es ist ziemlich einfach, die gleiche Sache in der Ansicht selbst zu erreichen, nur um etwas zu der Ansicht hinzufügen:

@{ 
    var jobs = projects.Jobs; 
    var totalTime = jobs.Sum(job => job.Logs.Sum(x => x.totaltime)); 
} 

<p>Total time is @totalTime</p> 
+0

Danke, ich denke ich werde dann ein Viewmodel verwenden, aber es ist gut zu wissen, dass ich es so machen kann. – Rob

1

Verwenden View-Modell, das zu tun, und ich empfehle sehr Operationen für gute Architektur in der Steuerung zu tun so:

Controller:

var jobs = db.JobsList.ToList(); 
var totalTime = jobs.Sum(x => x.Logs).Sum(x => x.totaltime)); 
Verwandte Themen