27 messaggi dal 22 settembre 2015
Salve, uso Entity framework con approccio Code First in un progetto MVC e ho creato una relazione uno a molti fra la tabella preesistente AspNetUsers (1) e la mia tabella Ordini (molti) in breve in questo modo:

public class ApplicationUser : IdentityUser
{
public string Nome { get; set; }
public string Cognome { get; set; }
public virtual ICollection<Ordine> Ordini { get; set; }
}

Invece nella classe Ordine:
public class Ordine
{
public int Id { get; set; }
public virtual ApplicationUser User { get; set; }
}
Ed effettivamente la relazione sembrerebbe creata correttamente, quando poi cerco di assegnare un ordine all'utente però mi da questo errore:
"Impossibile chiamare Member 'Load' per la proprietà 'Ordini' perché l'entità di tipo 'ApplicationUser' non esiste nel contesto. Per aggiungere un'entità al contesto, chiamare il metodo Add o Attach di DbSet<ApplicationUser>."
Questa è la parte di codice che utilizzo per assegnare un ordine all'utente:

var userManager = HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
var utente = await userManager.FindByNameAsync(this.User.Identity.Name);
var ordine = new Ordine {DataOrdine = DataOrdine, etc,,,}
db.Ordini.Add(ordine);
db.SaveChanges();
db.Entry(utente).Collection("Ordini").Load();
utente.Ordini.Add(ordine);
db.Entry(utente).State = EntityState.Modified;
db.SaveChanges();

E questa è la parte di codice che mi segna come errata:
db.Entry(utente).Collection("Ordini").Load();

Cosa sto sbagliando?
Spero possiate aiutarmi
Grazie in anticipo
ciao
Modificato da coffee88 il 13 aprile 2016 17.08 -
Modificato da coffee88 il 13 aprile 2016 17.27 -
Modificato da coffee88 il 13 aprile 2016 17.49 -
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,
puoi farlo in un paio di modi. Dato che non vedo come hai ottenuto un riferimento al dbcontext (varibile db), per ora ti propongo questo.
var userManager = HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
var utente = await userManager.FindByNameAsync(this.User.Identity.Name);
var ordine = new Ordine {DataOrdine = DataOrdine, UserId = utente.Id, ecc...};
db.Ordini.Add(ordine);
await db.SaveChangesAsync();

Per creare la relazione tra Ordine è ApplicationUser, è sufficiente valorizzare la chiave esterna UserId, che dovresti avere nella classe Ordine (EF te la creerebbe comunque sulla tabella, tanto vale definirla anche nella classe).

Invece, a proposito dell'errore:

E questa è la parte di codice che mi segna come errata:
db.Entry(utente).Collection("Ordini").Load();

EF ti dice che utente non è un'entità attualmente tracciata da questo DbContext, e quindi non puoi andarne a caricare gli ordini.
L'ApplicationUserManager usa anch'esso un DbContext dietro le quinte, ma tu probabilmente non stai usando la stessa istanza di DbContext (ecco perché volevo sapere come hai valorizzato la variabile db).

ciao,
Moreno
Modificato da BrightSoul il 13 aprile 2016 23.08 -

Enjoy learning and just keep making
27 messaggi dal 22 settembre 2015
Ciao e grazie per la risposta. Ho fatto come mi hai suggerito valorizzando la chiave esterna UserId e la relazione è stata creata correttamente, quindi ho assegnato un ordine al cliente.
Invece la variabile db è stata valorizzata in questo modo:
private ApplicationDbContext db = new ApplicationDbContext();

ciao
11.886 messaggi dal 09 febbraio 2002
Contributi
Ok, prova invece ad ottenere un riferimento al DbContext in questo modo:
var db = HttpContext.GetOwinContext().Get<ApplicationDbContext>();

Così riutilizzi l'instanza che era già stata creata per il contesto Owin corrente e non devi creartene una nuova. A questo punto, l'alternativa sarebbe stata semplicemente:
utente.Ordini.Add(ordine);
await db.SaveChangesAsync();

Qui EF capisce che deve creare una relazione perché hai aggiunto l'ordine alla collezione Ordini di quell'utente.
In un modo o nell'altro, il risultato ottenuto sarà lo stesso.

ciao,
Moreno

Enjoy learning and just keep making

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.