229 messaggi dal 20 novembre 2014
Grazie Moreno per la risposta, avevo fatto la prova a mettere la chiave a dx su Tipo_tipiintervento quando avevamo parlato di queste relazioni la prima volta ma se non ricordo male in questo modo ottennevo l'errore quando cercavo di inserire i record singoli sulla tabella ovvero quando cercavo di inserire un Tipo_tipiintervento.
Ad ogni modo proverò ad apportare la modifica e ti farò sapere
Buon weekend
Ciao
229 messaggi dal 20 novembre 2014
Ciao Moreno,
allora, sostanzialmente la modifica da te apportata è stata semplicemente quella di mettere una collection di tipo OperatoriAbilitatiInterventi su Tipo_TipoInterventi e così ho fatto.
Premesso il fatto che capisco che tu stai facendo fatica a seguire le connessioni perchè non conosci bene le relazioni e io sto facendo una fatica immane perchè ho stupidamente deciso di provare ad inserire queste proprietà di navigazione in una parte di progetto che era quasi completata... mi ritrovo davanti ad un altro problema, come sempre ovviabile (query + viewbag che ho sempre usato), ma vorrei capire il perchè mi succede questo: dunque creo un nuovo "OperatoreAbilitatoInterventi" e fin qui ok, senza fare join, mi fa vedere nome e cognome dell'operatore e tipo di intervento, ma i menu modifica, dettagli e cancella che prima sembravano funzionare adesso è come se non leggessero le proprietà di navigazione, infatti non vedo nome e cognome dell'operatore ma soltanto l'id, stessa cosa per il tipo di intervento.

Sul pulsante cancella addirittura mi restituisce un errore mai visto (googlando mi sembra di capire che è una sora di problema di cast, si aspetta una stringa e arriva un numero)

L'elemento del modello passato nel dizionario è di tipo 'System.Data.Entity.DynamicProxies.OperatoriAbilitatiIn_3BE67EEAA35474E0BAEDBDF6622C10D0D917407887DF4FA530FB6616822DAAEC', tuttavia il dizionario richiede un elemento di modello di tipo 'CadaNet.Models.V_OperatoriAbilitatiInterventi'.

Mi dai una dritta?
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,


ma i menu modifica, dettagli e cancella che prima sembravano funzionare adesso è come se non leggessero le proprietà di navigazione

Questo potrebbe dipendere dal fatto che le entità correlate alla principale, accessibili dalle proprietà di navigazione, non vengono caricate subito, a meno che non sia tu a volerlo.

Entity Framework ti dà varie opportunità di caricare le entità correlate. Puoi decidere di caricarle insieme all'entità principale (strategia chiamata eager loading o farlo fare in maniera trasparente da EF, nel momento in cui servono (strategia chiamata lazy loading).

Ne abbiamo parlato qui:
http://forum.aspitalia.com/forum/post/413981/Entity-Framework-Code-First-Delucidazioni.aspx
Leggi in particolare la risposta alla domanda 3).

Nel tuo caso, dato che nella View hai sicuramente bisogno di mostrare/modificare delle entità correlate, dovresti usare la strategia eager loading, ovvero usare .Include per dire ad EF di caricarle nella tua query LINQ. Esempio:
var idOperatore = 4;
//Carico operatoriabilitatiinterventi insieme all'operatore con un'unica query
var operatori = context.OperatoriAbilitatiInterventi.Include(o => o.Operatore).Where(o => o.IDOperatoreAbilitato == idOperatore).Single();



Sul pulsante cancella addirittura mi restituisce un errore mai visto

Sì, è indubbiamente un problema di casting ma mi sembra che interi e stringhe non c'entrino.
Qui hai un qualcosa che si aspetta di ricevere un V_OperatoriAbilitatiInterventi e invece tu stai passando l'entità che hai ottenuto dal database.
Cosa indica il prefisso V_? E' un DTO? Cioè è un qualcosa di diverso dalla classe che stai usando con Entity Framework?

ciao,
Moreno

Enjoy learning and just keep making
229 messaggi dal 20 novembre 2014
Ciao Moreno,
intanto grazie sempre per il tuo supporto


var idOperatore = 4;
//Carico operatoriabilitatiinterventi insieme all'operatore con un'unica query
var operatori = context.OperatoriAbilitatiInterventi.Include(o => o.Operatore).Where(o => o.IDOperatoreAbilitato == idOperatore).Single();



quello che mi chiedo è con la variabile operatori poi cosa ne fai? la mandi alla view?
Cioè io ho cerato di fare una cosa del genere, questo è il codice della edit:
public ActionResult Edit(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            OperatoriAbilitatiInterventi operatoriAbilitatiInterventi = db.OperatoriAbilitatiInterventi.Find(id);
            var list = db.OperatoriAbilitatiInterventi.Include(x => x.Personale).Where(x => x.IdOperatore == operatoriAbilitatiInterventi.IdOperatore).Single();
            db.OperatoriAbilitatiInterventi.Include(x => x.TipoTipoIntervento);
            if (operatoriAbilitatiInterventi == null)
            {
                return HttpNotFound();
            }
            return View(list);
        }


ma ovviamente non ottengo il risultato sperato, vedo sempre l'id dell'operatore e non il nome



Sì, è indubbiamente un problema di casting ma mi sembra che interi e stringhe non c'entrino.
Qui hai un qualcosa che si aspetta di ricevere un V_OperatoriAbilitatiInterventi e invece tu stai passando l'entità che hai ottenuto dal database.
Cosa indica il prefisso V_? E' un DTO? Cioè è un qualcosa di diverso dalla classe che stai usando con Entity Framework?


Si, non so cosa sia un DTO ma credo che sia come dici tu... cioè io ho sempre fatto le query con join con linq, le passo alla viewbag e mostro il risultato come una bombox nella view ovviamente per fare questo spesso ho bisogno di classi aggiuntive che sono clonate dall'originale ma mi servono solo per la vista perchè faccio diventare ad esempio int idOperatore{get; set) => string Operatore{get; set;}.

E' solo una classe d'appoggio che usavo per far comparire il nome dell'operatore anzicchè l'id, spero di essere stato chiaro.
Illuminami
Grazie
Ciao
Modificato da clr4633 il 23 agosto 2016 10.04 -
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao, prego!


quello che mi chiedo è con la variabile operatori poi cosa ne fai? la mandi alla view?

Dipende. Sarebbe il caso di non mandare l'entità tale e quale alla view ma di mapparla in un ViewModel/DTO, affinché la view abbia tra le mani solo quelle proprietà che le è consentito rappresentare in HTML



nella view ovviamente per fare questo spesso ho bisogno di classi aggiuntive che sono clonate dall'originale ma mi servono solo per la vista

Ottimo, questi sono DTO, ovvero classi "anemiche" che non hanno alcuna logica al loro interno ma espongono giusto delle proprietà da cui la view può trarre i dati da visualizzare a schermo.
Se nella view devi presentare vari tipi di oggetto, allora spesso la nuova classe si chiama amichevolmente "ViewModel".
Oltre al ViewBag stai usando la tipizzazione delle view?


var list = db.OperatoriAbilitatiInterventi.Include(x => x.Personale).Where(x => x.IdOperatore == operatoriAbilitatiInterventi.IdOperatore).Single();
db.OperatoriAbilitatiInterventi.Include(x => x.TipoTipoIntervento);

Non così, devi fare due include di seguito:
db.OperatoriAbilitatiInterventi.Include(x => x.Personale).Include(x => x.TipoTipoIntervento).Where(x => x.IdOperatore == operatoriAbilitatiInterventi.IdOperatore).Single();

Attenzione però perché il mio era solo un esempio. Io non so se devi effettivamente includere Personale, TipoTipoIntervento o quale altra entità correlata. Devi saperlo tu, conoscendo i dati che vuoi rappresentare nella view. Ora sai che se ti serve qualche dato dalle entità correlate, esse vanno caricate con Include. Decidi tu quando usarlo.

ciao,
Moreno
Modificato da BrightSoul il 24 agosto 2016 17.48 -

Enjoy learning and just keep making
229 messaggi dal 20 novembre 2014
Grazie mille Moreno,
funziona alla grande! E comunque si, uso la tipizzazione delle View :)
11.886 messaggi dal 09 febbraio 2002
Contributi
Benissimo, sono contento che funzioni :) Ora che lo scoglio è stato superato, come trovi questa soluzione? Pensi che la riutilizzerai in futuro?

Enjoy learning and just keep making
229 messaggi dal 20 novembre 2014
Ciao Moreno,

Benissimo, sono contento che funzioni :) Ora che lo scoglio è stato superato, come trovi questa soluzione? Pensi che la riutilizzerai in futuro?


in verità l'ho già usato in un'altra mini parte del progetto, diciamo che nonostante le difficoltà che posso incontrare cerco sempre di capirne il funzionamento per trarne vantaggi. Effettivamente questa tecnica da una parte non mi fa guadagnare granchè, es quando gestisco i viewmodel con le combobox (perchè devo comunque crearmi la viewbag e bla bla bla) però mi torna sicuramente più utile da almeno due punti di vista:
1- Usando le proprietà di navigazione sei sicuro di aver capito le relazioni nel db che hai progettato (cosa che sembra banale ma non lo è assolutamente quando il db o la parte di db progettata è di una certa dimensione)
2- Ti fornisce uno strumento ottimizzato e soprattutto veloce quando devi fare query con join particolari (precedentemente le facevo ugualmente ma era più complicato, ad es facevo una query e mettevo i dati su un modello, poi ne facevo un'altra che andava in join con quel modello e cossì via)

e poi vuoi mettere lo stimolo di imparare una cosa nuova (tutto quello che so di mvc, non sarà granchè, ma l'ho imparato da autodidatta, spulciando sul web e rompendo le scatole sul forum) :)
Grazie mille

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.