2017-12-06 1 views
0

Ich versuche, ein Ansichtsmodell in einem ASP.NET MVC5-Projekt zu schreiben, um Daten aus verschiedenen Tabellen in einem Formular anzuzeigen, das der Benutzer dann bearbeiten und speichern kann. Ich verwende die folgenden: -ViewModel für mehrere Tabellen ohne Verknüpfungen zwischen Tabellen

VS 2017, C#, MySQL-Datenbank, Entity Framework 6.1.3, MySQL Connector 6.9.9, Code Erste aus der Datenbank (vorhandene Datenbank, die ich nicht ändern kann)

Um die Angelegenheit zu komplizieren, gibt es keine Verbindungen zwischen den Tabellen in der Datenbank, so kann ich nicht herausfinden, wie man ein geeignetes Ansichtsmodell erstellt, das mir dann erlaubt, die Änderungen zu speichern.

Hier sind die 4 Tischmodelle: -

public partial class evc_bearer 
{ 
    [Key] 
    [Column(Order = 0] 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public long evcid { get; set; } 

    [Key] 
    [Column(Order = 1] 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public long bearerid { get; set; } 

    public int vlan { get; set; } 

    [Column("ref")] 
    public string _ref { get; set; } 

    [Required] 
    public string port { get; set; } 

    [Required] 
    public string endpoint { get; set; } 
} 



    public partial class bearer 
{ 
    [Key] 
    public long id { get; set; } 

    [Column("ref")] 
    [Required] 
    public string _ref { get; set; } 

    public string name { get; set; } 

    public long? site { get; set; } 

    public long? provider { get; set; } 

    public long? mtu { get; set; } 

    public float? rental { get; set; } 

    public int? offsiteprovider { get; set; } 

    public float? offsiteproviderrental { get; set; } 

    public bool? aend { get; set; } 

    public int? equipmentport { get; set; } 

    public string orderref { get; set; } 

    public string offsiteref { get; set; } 

    public string notes { get; set; } 

    public float? bookingfactor { get; set; } 
} 

public partial class evc 
{ 
    [Key] 
    public long id { get; set; } 

    [Required] 
    public string type { get; set; } 

    public byte servicetype { get; set; } 

    public byte cos { get; set; } 

    public int cir { get; set; } 

    public int pir { get; set; } 

    public bool burst { get; set; } 

    [Column("ref")] 
    public string _ref { get; set; } 

    public string orderref { get; set; } 

    public byte state { get; set; } 

    public string notes { get; set; } 

    public float? rental { get; set; } 
} 

    public partial class evc_provider 
{ 
    [Key] 
    public long id { get; set; } 

    [Required] 
    public string provider { get; set; } 
} 

Dies ist die Ansicht Modell ist ich mit dem Schreiben versucht: -

public partial class evcBearersVM 
{ 
    [Key] 
    [Column(Order = 0)] 
    public long evcid { get; set; } 

    [Key] 
    [Column(Order = 1)] 
    public long id { get; set; } 

    [Column("ref")] 
    public string b_ref { get; set; } 

    public string b_name { get; set; } 

    public string ep_provider { get; set; } 

    public int eb_vlan { get; set; } 

    public string eb_port { get; set; } 

    public string eb_endpoint { get; set; } 
} 

Dies ist die Linq Abfrage ich die Ansicht Modell bevölkert verwendet, um: -

So funktioniert die Abfrage und verbindet die Tabellen, um die Daten zu bekommen, die ich brauche und Ich kann dieses Datum nach Bedarf in verschiedenen Ansichten anzeigen. Jetzt muss ich in der Lage sein, eine Zeile zu bearbeiten und in der Datenbank zu speichern. Ich habe eine Bearbeitungsansicht, die die Daten zeigt, die ich brauche, aber ich bin mir nicht sicher, wie ich Änderungen speichern kann, da es sich um ein View-Modell handelt und der DB-Kontext das nicht bemerkt. Dankbar für jede Hilfe.

+1

verwenden Sie das Ansichtsmodell als Ihren httppost-Aktionsmethodenparameter. Innerhalb der Aktionsmethode werden Sie die Entität erneut lesen und die erforderlichen Eigenschaftswerte aktualisieren (mit den Werten aus dem Modell der geposteten Ansicht) und die Entität speichern – Shyju

+0

Danke @shyju Ich werde es versuchen. – Dugggie

+0

Um @shyju zu verdeutlichen, muss ich jede Tabelle einzeln basierend auf den aus der Ansicht zurückgegebenen Werten aktualisieren? (unter der Annahme, dass die geänderten Werte in verschiedenen Tabellen gespeichert sind). – Dugggie

Antwort

0

Verwenden Sie dasselbe Ansichtsmodell wie Ihren HttpPost-Aktionsmethodenparameter, und lesen Sie in der Aktionsmethode die Entitäten, die Sie mit den IDs udpaten möchten (Sie können diese aus dem Ansichtsmodell unter Annahme Ihres Formulars abrufen) sendet diese) und aktualisiert nur die Eigenschaften, die Sie aktualisieren müssen.

[HttpPost] 
public ActionResult Edit(evcBearersVM model) 
{ 
    var b = csdb.bearers.FirstOrDefault(a=>a.id==model.id); 
    if(b!=null) 
    { 
     b.name = model.b_name; 
     b._ref = model.b_ref; 
     csdb.SaveChanges(); 
    } 
    // Update the other entity as well. 

    return RedirectToAction("Index"); 
} 
+1

Ja, das ist fast genau das, was ich nach deinem Kommentar gemacht habe. Danke für die Hilfe. – Dugggie

+0

Kühl. Mein einziger Vorschlag ist die Verwendung von PascalCasing für die Eigenschaftsnamen 'Name' anstelle von' Name' – Shyju