Necesito establecer EntityObject's EntityKey. Sé su tipo y su valor de identificación. No quiero consultar la base de datos innecesariamente.EntityKey y ApplyPropertyChanges()
Esto funciona ...
//
// 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");
}
Esta falla ...
//
// 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");
}
Los ApplyPropertyChanges() línea de falla con esta excepción:
El ObjectStateManager no lo hace contiene un ObjectStateEntry con un referencia a un objeto del tipo 'Sample.Models.Department'.
Las dos EntityKeys son iguales. ¿Por qué falla el segundo bloque de código? ¿Cómo puedo arreglarlo?
+1 para el método de extensión. ¡Eso fue lindo! =) ¿Cómo debería cambiar el método si la tabla utiliza una PK de varias columnas? –
Debería realizar una sobrecarga del método de extensión que tomó un IEnumerable de KeyValuePair para especificar la clave, y luego llamar a la sobrecarga del constructor correspondiente en EntityKey. Para mantener la seguridad de stype y evitar pasar cadenas en su KeyValuePair, podría pasar una serie de delegados 'clave-finding' junto con los valores para poner en las claves. –
Basado en esta gran respuesta, lo mejoré un poco e hice mi propio pequeño método, que también publiqué como respuesta. Funciona para cualquier tipo de objeto de entidad y no usa delegados. –