Devo impostare EntityKey di EntityObject. Conosco il suo tipo e il suo valore di identificazione. Non voglio interrogare il database inutilmente.EntityKey e ApplyPropertyChanges()
Questo funziona ...
//
// POST: /Department/Edit/5
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(Guid id, Department Model)
{
Model.EntityKey = (from Department d in db.Department
where d.Id == id
select d).FirstOrDefault().EntityKey;
db.ApplyPropertyChanges(Model.EntityKey.EntitySetName, Model);
db.SaveChanges();
return RedirectToAction("Index");
}
Questo fallisce ...
//
// POST: /Department/Edit/5
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(Guid id, Department Model)
{
String EntitySetName = db.DefaultContainerName + "." + Model.GetType().Name;
Model.EntityKey = new System.Data.EntityKey(EntitySetName, "Id", Model.Id);
db.ApplyPropertyChanges(Model.EntityKey.EntitySetName, Model);
db.SaveChanges();
return RedirectToAction("Index");
}
I ApplyPropertyChanges() linea non riesce con questa eccezione:
L'ObjectStateManager non lo fa contengono un oggetto ObjectStateEntry con unRiferimentoa un oggetto di tipo "Sample.Models.Department".
Le due EntityKeys sono uguali. Perché il secondo blocco di codice fallisce? Come posso ripararlo?
+1 per il metodo di estensione. Era carino! =) Come dovrebbe cambiare il metodo se la tabella usa un PK a colonne multiple? –
È necessario eseguire un sovraccarico del metodo di estensione che ha richiesto a IEnumerable di KeyValuePair di specificare la chiave, quindi chiamare il sovraccarico del costruttore corrispondente su EntityKey. Per mantenere la sicurezza dello stype ed evitare il passaggio di stringhe nel KeyValuePair, è possibile passare una serie di delegati di "ricerca di chiavi" insieme ai valori da inserire nelle chiavi. –
Sulla base di questa ottima risposta, l'ho migliorata un po 'e ho creato il mio piccolo metodo, che ho anche postato come risposta. Funziona per qualsiasi tipo di oggetto entità e non utilizza delegati. –