2016-03-30 10 views
0

Ich baue eine WPF MVVM Light-App in Visual Studio 2015 mit Entity Framework 6 mit Datenbank-erster Modellgenerierung. Ich erstelle View Model-Klassen für meine Modelle, die mit meinen Ansichten (Benutzersteuerelementen) verwendet werden können.Map Entity Framework-Navigationseigenschaften zu ViewModel-Objekten

Ich habe die folgenden drei EF-Modelle; ein Employee kann viele EmployeeStatu haben und ein EmployeeStatu hat eine entsprechende description ('Urlaub von Abwesenheit', 'Archiviert', etc.) auf dem ValidEmployeeStatu Modell. So ist employeeID FK auf EmployeeStatu und validEmployeeStatusID ist FK auf EmployeeStatu (PK auf ValidEmployeeStatu).

public partial class Employee 
{ 
    public Employee() 
    { 
     this.EmployeeStatus = new HashSet<EmployeeStatu>(); 
    } 

    public int employeeID { get; set; } 
    // More properties here... 

    public virtual ICollection<EmployeeStatu> EmployeeStatus { get; set; } 
} 

public partial class EmployeeStatu 
{ 
    public int employeeStatusID { get; set; } 
    public int employeeID { get; set; } 
    public int validEmployeeStatusID { get; set; } 
    // More properties here... 

    public virtual Employee Employee { get; set; } 
    public virtual ValidEmployeeStatu ValidEmployeeStatu { get; set; } 
} 

public partial class ValidEmployeeStatu 
{ 
    public ValidEmployeeStatu() 
    { 
     this.EmployeeStatus = new HashSet<EmployeeStatu>(); 
    } 

    public int validEmployeeStatusID { get; set; } 
    public string description { get; set; } 
    // More properties here...  

    public virtual ICollection<EmployeeStatu> EmployeeStatus { get; set; } 
} 

Hier ist mein View-Modell für Mitarbeiter; die anderen folgen dem gleichen Muster:

public class EmployeeViewModel : ViewModelBase 
{ 
    private int _employeeId; 
    private string _securityId; 
    private IEnumerable<EmployeeStatusViewModel> _employeeStatus; 

    public EmployeeViewModel() 
    { 
     this.EmployeeStatusVMs = new HashSet<EmployeeStatusViewModel>(); 
    } 

    public IEnumerable<EmployeeStatusViewModel> EmployeeStatusVMs 
    { 
     get { return _employeeStatus; } 
     set 
     { 
      if (_employeeStatus.Equals(value)) return; 
      _employeeStatus = value; 
      RaisePropertyChanged(); 
     } 
    } 

    // More properties here... 
} 

ich diese LINQ-Abfrage bin mit der Daten zu holen:

var query = (from e in Context.Employees 
      .Include("EmployeeStatus.ValidEmployeeStatu") 
      .Where(comparison) 
      select new EmployeeViewModel 
      { 
       employeeID = e.employeeID, 
       securityID = e.securityID, 
       firstName = e.firstName, 
       middleName = e.middleName, 
       lastName = e.lastName, 
       suffix = e.suffix, 
       job = e.job, 
       organizationalUnit = e.organizationalUnit, 
       costCenter = e.costCenter, 
       notes = e.notes, 
       createdDate = e.createdDate 
      }); 

Wie ordne ich die Navigationseigenschaften EmployeeStatu und ValidEmployeeStatu meiner Ansicht Modelle? Und wie geben Sie dann die Werte aus den View Model-Objekten für SaveChanges() an Ihre Modelle zurück? Vielen Dank.

Antwort

1

Sie sollten das gleiche wie in der ersten Ebene der Modelle tun. Also innerhalb deiner Schöpfung von EmployeeViewModel mag sth:

employeeStatus = e.EmployeeStatus.Select(s=>new EmployeeStatusViewModel{...}.ToList() 

Wenn zurück bewegt die gleiche Art von Mapping zu modellieren, sondern von Ansichtsmodell zu modellieren. Oder Sie können den Automapper auschecken. Nach Blogs suchen

+0

Danke, @jstadnicki. Das macht vollkommen Sinn. Verfügen Sie über eine Beispielzeile, die der Rückgabe der Daten von VM an Model ähnelt? Irgendwie konnte ich auf Automapper keine gute Dokumentation finden; Viele der Links hatten Code für veraltete Methoden. – Alex

+0

Suche nach Auto-Mapper. Sie werden sehen, dass dies nicht von Hand gemacht werden muss. Grundsätzlich werden die Zuordnungen 1-1 automatisch, in beiden Richtungen, durchgeführt. – jstadnicki

+0

Ich würde gerne Automapper verwenden, wenn ich es verstanden habe, @jstadnicki :) Die Links, die ich fand, hatten einige, aber nicht vollständige Anfängerleitfaden. Das "Getting Started" von der Hauptseite hat nicht viel geholfen für einen Anfänger wie mich! Ich würde gerne sehen, was Sie oben in Automapper-Syntax geschrieben haben. – Alex