Ciao, prego!
La relazione è uno-a-molti, infatti sullo stesso profilo posso avere più User.
Allora ok, la relazione è modellata correttamente. In questo caso UserProfile è l'entità principale e gli User sono le dipendenti.
Come ti dicevo se non gli do il comando user.ProfileId = user.Profile.Id non mi permette di salvare in quanto va in eccezione.
Secondo il codice che hai postato, non è user.ProfileId, ma user.UserProfileId.
Sembra una stupidaggine ma è importante notarlo perchè la proprietà di navigazione relativa a questa foreign key si chiama semplciemente
Profile e non UserProfile.
Questo non rispetta la convenzione di nomi e perciò EF non sta capendo che quella è la proprietà di navigazione relativa a UserProfileId.
Dovresti o cambiargli nome o legarle esplicitamente usando l'attributo ForeignKey.
[ForeignKey(nameof(Profile))]
public int UserProfileId { get; set; }
Nota al margine: a questo punto è indifferente valorizzare la proprietà foreign key (UserProfileId) o la proprietà di navigazione (Profile). Entity Framework farà il cosiddetto "relationship fixup" al SaveChanges, e renderà entrambe le proprietà coerenti.
Sto sviluppando un'applicazione MVC basata su AngularJS non capisco però come possa in questo contesto funzionare il Lazy Loading.
Non ha importanza quale sia il linguaggio o la tecnologia usata client-side. Lazy loading e Include sono funzionalità di Entity Framework.
Se stai visualizzando un elenco di tutti i profili (e dei relativi utenti), allora dovresti usare l'Include, in modo che EF non generi molte query al database.
A prescindere dal sistema di caricamento usato con EF, il risultato si presenterà ad Angular come un unico array JSON (o altro formato di serializzazione che hai scelto di usare).
Se imposto "Include" ottengo che la query sul db è una sola anche se avessi 1.000 utenti?
Sì, EF farà una SQL Join per estrarre con un colpo solo sia le informazioni sugli User che sugli UserProfile.
Ovviamente cerca di non estrarre 1000 utenti, ma solo quelli che visualizzi effettivamente nella pagina. Quando l'utente va alla pagina successiva, allora invia una nuova richiesta ajax per recuperare altri risultati.
Uso come dicevo MVC con Angular...non credo che TryUpdateModel possa venirmi incontro...o sbaglio?
Beh, potresti pur sempre dare ai tuoi campi input dei
name che seguono la convenzione di MVC, in modo che sfrutti il suo model binder. Ecco un esempio (non con Angular ma il principio è lo stesso).
http://forum.aspitalia.com/forum/post/403972/Inserire-Lista-Proprieta-Model-Interno-Form.aspx#404046Se segui questa convenzione, puoi usare TryUpdateModel. Ha senso nelle applicazioni data-driven.
Inoltre, hai valutato ASP.NET Web API al posto di MVC? Ti avrebbe permesso di postare oggetti JSON alle action. Più utile nelle interfacce task-based.
ciao,
Moreno
Modificato da BrightSoul il 11 agosto 2016 22.47 -