6

Ich versuche, an einer einfachen Anwendung zu arbeiten. Ich habe drei SQL-Tabellen über Entity Framework eingeführt und die Modelle automatisch erstellt. Ich möchte die Create/Details/Edit usw. Ansichten in Visual Studio automatisch aufbauen. Ich kann dies automatisch tun, wenn ich von einem einzelnen Modell gerüstet bin (wie zB Name allein), aber bei Verwendung eines Ansichtsmodells als Quelle nirgendwohin komme.Wie ein Modell in MVC 5 Scaffold

Hier sind meine Modelle

Namen

public partial class Name 
{ 
    public Name() 
    { 
     this.Addresses = new HashSet<Address>(); 
     this.Emails = new HashSet<Email>(); 
    } 

    public int ID { get; set; } 
    public string FIRST_NAME { get; set; } 
    public string LAST_NAME { get; set; } 

    public virtual ICollection<Address> Addresses { get; set; } 
    public virtual ICollection<Email> Emails { get; set; } 
} 

Adresse

public partial class Address 
{ 
    public int ADDRESS_ID { get; set; } 
    public int NameID { get; set; } 
    public string ADDRESS_1 { get; set; } 
    public string CITY { get; set; } 
    public string STATE { get; set; } 
    public string ZIP { get; set; } 

    public virtual Name Name { get; set; } 
} 

Email

public partial class Email 
{ 
    public int EMAIL_ID { get; set; } 
    public int NameID { get; set; } 
    public string EMAIL { get; set; } 

    public virtual Name Name { get; set; } 
} 

und eine Ansicht Modell I aller drei erstellt

public class MainVM 
{ 
    public Name Name { get; set; } 
    public Address Address { get; set; } 
    public Email Email { get; set; } 
} 

Ich kann die Schritte durchlaufen eine Steuerung zu schaffen - Rechtsklick-Controller >> Hinzufügen >>-Controller >> MVC 5-Controller mit Ansichten, mit Entity Framework.

Als nächstes komme ich zu diesem Bildschirm.

enter image description here

Wenn ich hinzufügen klicken, werde ich die folgende Fehlermeldung erhalten.

enter image description here

ich in anderen Antworten gelesen haben, die Sie benötigen die Datenkontextklasse löschen (aus dem ersten Bild), wenn Sie eine Ansicht Modell verwenden, aber wenn ich das tue, auf die Schaltfläche Hinzufügen wird deaktiviert. Ich kann nicht weiter gehen. Irgendwelche Ideen hier?

+0

Ich glaube nicht, Sie mögen dieses Gerüst kann. Der Assistent erwartet, dass Sie Entitätsmodelle auswählen, und Sie geben ihm Ansichtsmodelle. – DavidG

+1

Ich dachte, dass es nicht möglich ist, aber das Ansichtsmodell wird in der Liste der Auswahlmöglichkeiten angezeigt, wenn Sie Ihre Modellklasse auswählen. Wenn Sie das wirklich nicht tun können, möchte ich, dass jemand es bestätigt, ansonsten würde ich eine Lösung wirklich schätzen. – madvora

Antwort

2

Ich habe versucht, ein View-Modell in einem Controller zu verwenden und den gleichen Fehler erhalten. Ich fügte dann einen ID-Schlüssel hinzu, um den Fehler zu beheben, und EF erstellte eine Tabelle, die das Ansichtsmodell in meiner Datenbank darstellt. Damit bin ich zu dem Schluss gekommen, dass View Models nichts über die Datenbank wissen sollen und nur für die Darstellung in der View verwendet werden. In der Steuerung habe ich die Datenbankoperationen für die verschiedenen Entitäten bearbeitet.

Ich musste manuell eine Ansicht erstellen und @model myproject.ViewModels.MyViewModel in der Ansicht verwenden, um das Ansichtsmodell für die HTML-Helfer darzustellen.

Dieser Prozess funktionierte für mich und ich konnte die Informationen in den richtigen Datenbanktabellen pro Entitätsmodell speichern.

Der folgende Code ist ein Beispiel. Sie können das Mapping-Tool verwenden, anstatt den Code manuell einzugeben. Brechen Sie das Viewmodel in die Entitäten auf, die mit Entity Framework gespeichert werden sollen.

public ActionResult EmployeeDepartment(EmployeeViewModel evm) 
    { 
     if(ModelState.IsValid) 
     { 
      try 
      { 

       Department dept = new Department(); 
       dept.DepartmentName = evm.DepartmentName; 
       dept.DepartmentNumber = evm.DepartmentNumber; 

       db.Departments.Add(dept); 
       db.SaveChanges(); 

       Employee emp = new Employee(); 

       emp.FirstName = evm.FirstName; 
       emp.LastName = evm.LastName; 
       emp.Department = dept; 

       db.Employees.Add(emp); 
       db.SaveChanges(); 

       return RedirectToAction("Index"); 
      } 
      catch(Exception ex) 
      { 
       //write code for exception 
      } 
     } 
      return View(); 


    } 
+1

Können Sie Ihren Code hier teilen? Danke? –

0

Halten Sie die Datenkontextklasse leer und versuchen Sie dann, die Ansicht hinzuzufügen. Es hat für mich funktioniert. Fügen Sie auch [Key] zu einem beliebigen ID-Attribut hinzu.

3

Ich wette, dass das ursprüngliche Poster zu dieser Zeit noch nicht nach einer Antwort suchen wird. aber es kann Suchern wie mir helfen.

Fanden Sie diesen Artikel etwas Hilfe.Link

Es scheint, während die Strecke unter Controller -> Add -> New Scaffolded Artikel -> MVC-Controller mit Ansichten, Entity Framework mit funktioniert nicht gut mit Blick Modellen.

Wenn Sie bei der Auswahl des Ansichtsmodells keine DataContext-Klasse im oben genannten Gerüstprozess bereitgestellt haben, können Sie mit MVC Scaffolding nicht fortfahren. Wie Sie angegeben haben, ist die Schaltfläche "Hinzufügen" deaktiviert.

Die Problemumgehung besteht darin, einen zweistufigen Ansatz zu wählen.

Erste Controller-Aktionen erstellen Gerüst mit (Controller -> Add -> New Scaffolded Artikel -> MVC-Controller mit Lese-/Schreibaktionen)

Und dann fügen Sie Ansichten mit einem rechten Mausklick auf einzelne Controller-Aktion Methoden und dann Gerüste nutzen. (Die Aktionsmethode des Controllers -> Rechtsklick -> Ansicht hinzufügen -> Vorlage -> [alles wählen außer Leer (ohne Modell)] -> Modellklasse -> [wählen Sie hier Ihr Ansichtsmodell] ->Lassen Sie die Datenkontextklasse leer - > Hinzufügen Schaltfläche wird jetzt aktiviert).

Der verlinkte Artikel deckt die Schritte im Detail bitte sehen Sie.

Sie müssen jedoch noch Code hinzufügen, um mit der Datenbank zu arbeiten, indem Sie das Entity-Framework in Ihren Controller-Aktionsmethoden verwenden. (Oder Sie können wählen, Business-Schichten, Repositories usw. einzuführen. YMMV) Aber das hilft zu vermeiden, viel Code zu schreiben, um Ihre Ansichten zu erstellen.

PS: Ich fand diesen Ansatz Arbeit für mich ganz gut bei der Verwendung von ASP.Net Kern 1.1