Diciamo che hai queste classi nelle tue entità.E 'davvero impossibile aggiornare la raccolta dei bambini in EF fuori dagli schemi (alias modo non hacky)?
public class Parent
{
public int ParentID { get; set; }
public virtual ICollection<Child> Children { get; set; }
}
public class Child
{
public int ChildID { get; set; }
public int ParentID { get; set; }
public virtual Parent Parent { get; set; }
}
E si dispone di un'interfaccia utente per aggiornare il Parent
insieme al suo Children
, cioè se l'utente aggiungere nuove Child
poi si deve inserire, se l'utente modifica un Child
esistente allora avete bisogno di aggiornare e, se l'utente rimuove uno Child
quindi è necessario eliminare. Ora, ovviamente, se si utilizza il seguente codice
public void Update(Parent obj)
{
_parent.Attach(obj);
_dbContext.Entry(obj).State = EntityState.Modified;
_dbContext.SaveChanges();
}
non sarà in grado di rilevare i cambiamenti all'interno del Child
perché EF non è in grado di rilevare i cambiamenti all'interno di una proprietà di navigazione.
Ho fatto questa domanda per come 4 volte e ottenere risposte miste. Quindi è davvero possibile fare questa roba senza che si complichi? Questo problema può risolvere il problema separando l'interfaccia utente tra Parent
e Child
, ma non voglio perché l'unione di entrambi gli elementi Child
e Parent
in un menu è piuttosto comune nello sviluppo di applicazioni aziendali e più user-friendly.
UPDATE: Sto provando la soluzione in basso ma non funziona.
public ActionResult(ParentViewModel model)
{
var parentFromDB = context.Parent.Get(model.ParentID);
if (parentFromDB != null)
{
parentFromDB.Childs = model.Childs;
}
context.SaveChanges();
}
Invece di rilevare i cambiamenti all'interno dei bambini, EF non sarà in grado di dire che cosa fare con il vecchio bambino. Ad esempio se parentFromDB
ha 3 figli la prima volta che lo estraggo dal DB, allora cancello il 2 ° e il 3 ° figlio. Quindi sto ricevendo The relationship could not be changed because one or more of the foreign-key properties is non-nullable
quando salvo.
Credo che questo sia ciò che è accaduto: The relationship could not be changed because one or more of the foreign-key properties is non-nullable
che mi ha portato di nuovo al punto di partenza perché nel mio scenario, non posso prendere dal DB e aggiornare la voce e chiamare SaveChanges
.
Non so se mi hanno frainteso la tua domanda. Disabilitare il rilevamento delle modifiche è un prerequisito? Perché altrimenti questo si ottiene facilmente con il cambio di tracciamento EF. Con il rilevamento delle modifiche non è necessario impostare in modo esplicito lo stato delle entità, EF lo farà per te, quindi tutte le modifiche apportate alla raccolta Childs, incluse le modifiche sulle entità nella raccolta, verranno automaticamente incluse nel set di modifiche quando si commette il contesto (SaveChanges). –
Sono d'accordo con il commento di odyss-jii, ma voglio aggiungere ulteriori informazioni ad esso: ovviamente questo funziona solo quando si mantiene il contesto aperto tra il recupero e la modifica delle proprietà. altrimenti dovrai impostare tu stesso lo stato della tua entità e per questo dovrai prima ottenere tutto nel contesto, quindi dovrai creare una voce per ogni oggetto e impostarne lo stato. – DevilSuichiro
puoi essere più specifico? Inserisci un codice, se possibile. Questo è ciò che intendo (non riesco a trovare la versione EF6). http://www.entityframeworktutorial.net/EntityFramework4.3/update-one-to-many-entity-using-dbcontext.aspx – warheat1990