Come aggiornare le quadro correlate in Entity Framework

Possiedo un progetto MVC e utilizzo degli oggetti Entity Framework Code First e POCO per il database. Per esempio:

public class ClassA { public int? Id {get; set;} public string Name { get; set;} public virtual ClassB B {get; set;} } public class ClassB { public int? Id {get;set;} public string Description {get;set;} } 

Ho un ActionResult che crea o modifica un modello. Il problema è quando chiamo ActionResult per aggiornare il modello, e model.B è stato modificato, la relazione non è stata salvata nel database. Quando viene chiamato ActionResult per creare un nuovo object, funziona come previsto. Come lo risolvo?

 public ActionResult Save(ClassA model) { model.B = GetBFromDb(model.B.Id.Value); if(ModelState.IsValid) { if (id.HasValue) { context.Entry(model).State = System.Data.EntityState.Modified; } else { context.ClassAs.Add(model); } context.SaveChanges(); // redirect to index etc. } return View("EditForm", model); } 

Ho risolto il problema cambiando ClassA con una chiave esterna a ClassB e impostando il valore di BId :

 public class ClassA { public int? Id {get; set;} public string Name { get; set;} public int BId {get;set;} // foreign key to B public virtual ClassB B {get; set;} } 

Perché questa proprietà di chiave esterna fa il lavoro invece del generato estero di EF?

Non puoi semplicemente chiamare:

 context.Entry(model).State = System.Data.EntityState.Modified; 

L’entity framework deve essere prima recuperata dal contesto in modo che EF possa iniziare a seguirlo. Quindi dovrai applicare eventuali modifiche a quell’ quadro prima di chiamare context.SaveChanges() .

 var entity = context.ClassAs.Find(model.Id); // set properties you want to modify on entity entity.Name = model.Name; entity.ClassB = context.ClassBs.Find(model.ClassB.Id); // other changes to entity as required... context.SaveChanges(); 

In questo modo EF sta monitorando l’ entity e sa di applicare un aggiornamento contro di essa.

Se si allega e quindi si imposta lo stato sull’entity framework modificata, il framework invierà tutte le proprietà per l’aggiornamento. Non devi prendere l’approccio della lontra qui di seguito, perché ciò provoca un intero carico separato. Se lo fai in quel modo non ha senso passare in un modello, solo un id e poi chiama TryUpdateModel per riempire le proprietà dal modulo.

Personalmente l’allegato come modificato qui è un po ‘più pulito in quanto non richiede un round trip completo a causa del caricamento dei dati

http://geekswithblogs.net/michelotti/archive/2009/11/27/attaching-modified-entities-in-ef-4.aspx