6

Sto provando a lavorare su una semplice applicazione. Ho tre tabelle SQL introdotte tramite Entity Framework e ho creato automaticamente i modelli. Desidero essere in grado di impalcare automaticamente le viste Crea/Dettagli/Modifica ecc. In Visual Studio. Posso farlo automaticamente quando ho uno scaffold da un singolo modello (come Nome da solo), ma non posso andare da nessuna parte quando uso un modello di vista come sorgente.How to Scaffold a View Model in MVC 5

Qui sono i miei modelli

Nome

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; } 
} 

Indirizzo

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; } 
} 

e una vista del modello ho creato di tutti e tre

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

posso passare attraverso le fasi di creazione di un regolatore - Controller Fare clic destro >> Aggiungi >> >> controller MVC 5 controller con vista, utilizzando Entity Framework.

Avanti Arrivo a questa schermata.

enter image description here

Se clicco su Aggiungi, mi metterò il seguente errore.

enter image description here

che ho letto in altre risposte che avete bisogno di cancellare la classe del contesto dati (dalla prima immagine) se si utilizza una vista del modello, ma se lo faccio, il pulsante Aggiungi diviene disattivato. Non posso andare oltre. Qualche idea qui?

+0

Non credo che si può patibolo come questo. Il wizard si aspetta che tu scelga i modelli di entità e tu gli dai modelli di vista. – DavidG

+1

Ho pensato che potrebbe non essere possibile, ma il modello di visualizzazione viene visualizzato nell'elenco delle scelte quando si sceglie la classe del modello. Se davvero non puoi farlo, vorrei che qualcuno lo confermasse, altrimenti apprezzerei davvero una soluzione. – madvora

risposta

2

Ho provato a utilizzare un modello di vista in un controller e ho ottenuto lo stesso errore. Ho quindi aggiunto una chiave ID per risolvere l'errore e EF ha creato una tabella che rappresenta il modello di visualizzazione nel mio database. Con ciò ho concluso che View Models non deve sapere nulla del database e viene utilizzato solo per la presentazione nella View. Nel controller ho gestito le operazioni del database per le diverse entità.

Ho dovuto creare manualmente una vista e utilizzare @model myproject.ViewModels.MyViewModel nella vista per rappresentare il modello di vista per gli helper Html.

Questo processo ha funzionato per me e sono riuscito a salvare le informazioni nelle tabelle del database appropriate per modello di entità.

Il seguente codice è un esempio. È possibile utilizzare lo strumento di mappatura invece di digitare manualmente il codice. Rompere il viewmodel verso l'alto nelle entità per salvare usando Entity Framework.

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

Puoi condividere il tuo codice qui grazie? –

0

Mantenere la classe del contesto dati vuota e quindi provare ad aggiungere la vista. Ha funzionato per me. Inoltre, aggiungi [Key] a qualsiasi attributo id.

3

Scommetto che il poster originale potrebbe non essere ancora in cerca di una risposta entro questa volta. ma può aiutare i cercatori come me ..

Trovato questo articolo essere di aiuto.Link

Sembra durante l'assunzione del percorso Controller -> Aggiungi -> Nuovo elemento ponteggi -> Regolatore MVC con vista, utilizzando Entity Framework non funziona bene con i modelli di vista.

Se non è stata fornita una classe DataContext nel processo di scaffold sopra menzionato mentre si seleziona il proprio modello di visualizzazione, lo scaffolding MVC non consente di procedere ulteriormente. Come hai indicato il pulsante "Aggiungi" è disabilitato.

La soluzione alternativa è di adottare un approccio in due fasi.

Innanzitutto creare azioni di controllo che utilizzano ponteggi (Controllers -> Aggiungi -> Nuovo elemento ponteggi -> MVC Regolatore con lettura/scrittura azioni)

e quindi aggiungere viste facendo clic destro su singoli metodi di azione del controller e poi approfittando del ponteggio. (Metodo di azione del controllore -> Tasto destro -> Aggiungi vista -> Modello -> [scegli qualsiasi cosa tranne Vuoto (senza modello)] -> Tipo di modello -> [scegli il modello di visualizzazione qui] ->Lascia una classe di contesto Data vuota - > Il pulsante Aggiungi sarà ora abilitato).

L'articolo collegato illustra i passaggi in dettaglio per favore dare un'occhiata.

Tuttavia, sarà comunque necessario aggiungere codice per lavorare con il database utilizzando Entity framework nei metodi di azione del controller. (Oppure puoi scegliere di introdurre i livelli Busines, i repository ecc. YMMV) Ma questo aiuta a evitare di scrivere molto codice per creare le tue visualizzazioni.

PS: Ho trovato questo lavoro approccio bene per me durante l'utilizzo di nucleo ASP.Net 1.1