285 messaggi dal 14 novembre 2001
Ciao, sto facendo un po' di pratica seguendo il libro Asp.Net Core 2, ma da giorni non riesco a venire a capo di un problema, spero di riuscire a spiegarmi per ricevere aiuto

Attraverso lo Scaffolding guidato di visual studio, partendo da un Model, ho creato il Controller e la relativa View su una tabella (una semplice Anagrafica di magazzini)

Questa tabella ha 3 foreign key (presenti anche nel file DBContext.cs).

Eseguendo il progetto, noto che tutto funziona correttamente, parlo anche delle pagine Index, Details, Edit e Create (.cshtml).

Noto però anche che alle 3 foreign Key mi ritrovo associati dei campi sbagliati. Esemepio: con l'ID_AnagraficaUtente mi associa il CAP anziché il Cognome.

Allora mi metto a studiare un po' il codice, vado ad apportare delle modifiche manualmente nella index, nella edit, nella Details, e soprattutto nel Controller, in queste righe:

ViewData["IdAnagraficaUtente"] = new SelectList(_context.AnagraficaUtenti, "IdAnagraficaUtente", "Cognome", anagraficaRivendite.IdAnagraficaUtente);

ViewData["IdCodicePlantSap"] = new SelectList(_context.AnagraficaPlantSap, "IdCodicePlantSap", "NomePlantSAP", anagraficaRivendite.IdCodicePlantSap);

dove al posto di Cognome c'era appunto CAP, e al posto di NomePlantSAP c'era un altro campo (sempre varchar)

Eseguo e funziona. Ora viene visualizzato correttamente il campo Cognome e NomePlantSAP.
Dove sta il problema? Se vado in EDIT ricevo questo errore

NullReferenceException: Object reference not set to an instance of an object.

AspNetCore.Views_AnagraficaRivendites_Edit.<ExecuteAsync>b__20_0() in Edit.cshtml
   33. <select asp-for="IdCodicePlantSap" class="form-control" asp-items="ViewBag.IdCodicePlantSap"></select>



Allora provo a togliere la riga 33 e l'errore non si verifica, viene mostrata una bella dropdownlist con tutti i cognomi, per cui deduco che la modifica effettuata nel Controller sul campo Cognome funziona mentre su NomePlantSAP no.

E ancora se ad esempio invece del Cognome voglio mostrare il campo eMail (che è un normalissimo campo di testo varchar(20), come il Cognome!) ricevo lo stesso errore avuto con NomePlantSAP.

In pratica a seconda del campo che voglio mostrare e che vado a mettere in ViewData del Controller, ricevo un errore oppure no.
I campi che scelgo hanno lo stesso formato, non ammettono NULL, non hanno record vuoti. Tornando al mio esempio i campi Cognome, Nome o Indirizzo vengono "digeriti" e mostrati senza problema, i campi eMail e NomePlantSAP no, mi danno errore.

Dove mi perdo qualcosa secondo voi? Saluti :)

Campo Testaccio, c'hai tanta gloria...
897 messaggi dal 11 febbraio 2013
Prova a istanziare gli oggetti che sono le fk nel viewModel che usi per fare le insert e update.
Fammi sapere
285 messaggi dal 14 novembre 2001
jjchuck ha scritto:
Prova a istanziare gli oggetti che sono le fk nel viewModel che usi per fare le insert e update.
Fammi sapere


Grazie per la risposta, purtroppo non riesco a venirne a capo

ho provato cose di questo tipo per referenziare la fk nel Model, o intendevi qualcosa di diverso?
[Display(Name = "NomePlantSAP")]
public short IdCodicePlantSap { get; set; }
[ForeignKey("IdCodicePlantSap")]
public virtual AnagraficaPlantSap NomePlantSapNavigation { get; set; }



L'anomalia che però mi sta facendo perdere la bussola è che, a seconda del nome del campo che vado a mettere qui
ViewData["IdCodicePlantSap"] = new SelectList(_context.AnagraficaPlantSap, "IdCodicePlantSap", "NomePlantSAP", anagraficaRivendite.IdCodicePlantSap);


ricevo o meno errore. "NomePlantSAP" mi dà errore (ed è quello che mi interessa). "NomePlantSAPL" (un campo molto simile) mi dà errore, "CAP" errore.
Per contro invece, campi sempre varchar (e sempre che non ammettono NULL), non danno problemi: "Telefono", "Gestore", "Indirizzo", "Stato"

Ma come è possibile?

Campo Testaccio, c'hai tanta gloria...
897 messaggi dal 11 febbraio 2013
public class User
    {
        public int Id { get; set; }
        public string UserName { get; set; }
        public string Password { get; set; }
        ...      
       
        public List<Order> Orders { get; set; } = new List<Order>(); <== INTENDEVO QUESTO

    }
285 messaggi dal 14 novembre 2001
Questo tuo codice public List<Order> Orders { get; set; } = new List<Order>(); <== INTENDEVO QUESTO
dovrei metterlo qui (è il file del model, il .cs)?

    public partial class AnagraficaRivendite
    {
        public int IdAnagraficaRivendita { get; set; }
        public byte Stato { get; set; }
        public byte IdAnagraficaUtente { get; set; }
        public short IdCodicePlantSap { get; set; }
        public int CodiceIstatFormNum { get; set; }
        public short NumeroRivendita { get; set; }
        public string CapRivendita { get; set; }
        ...

        public virtual AnagraficaComuni NomeComuneNavigation { get; set; }
        public virtual AnagraficaUtenti CognomeNavigation { get; set; }
        public virtual AnagraficaPlantSap NomePlantSapNavigation { get; set; }



Ad ogni modo, trattandosi di un progetto e un db di prova, ho eliminato dalla tabella AnagraficaPlantSAP tutte le colonne lasciando solo la primaryKey (che è anche la Foreign Key nella tabella AnagraficaRivendite dove ricevo l'errore) e il campo NomePlantSAP, poi ho cancellato e ricreato con lo scaffolding il controller e le view e ora funziona!
In Edit.cshmtl viene correttamente visualizzata una lista con la possibilità di selezionare il NomePlantSAP

Un piccolo passo in avanti anche se ancora non ho capito cosa scatena l'errore con la tabella completa di tutti i campi, fermo restando che vorrei provare ad implementare la modifica che mi hai suggerito tu.

Campo Testaccio, c'hai tanta gloria...
897 messaggi dal 11 febbraio 2013
Io non ti ho suggerito niente di importante
è solo un esempio di null ref che entity framework mi dava quando non istanziavo le navigation property
tutto
qua

ciao
285 messaggi dal 14 novembre 2001
Alla fine ho trovato l'errore, scrivevo male il campo NomePlantSAP, che nel relativo model è invece NomePlantSap.
Purtroppo andandolo a correggere manualmente nell'Edit del Controller che ho postato sopra, ho scritto il nome del campo così come è nel DB (SAP e non Sap), e questo generava l'errore.

Grazie comunque anche a jjchuck ;)

Campo Testaccio, c'hai tanta gloria...

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.