Hace un tiempo busqué una buena forma de hacer esto y no pude encontrar uno. En general, termino construyendo un método de extensión GetEntityByKey en algún lugar y dentro de eso, contactando cadenas para construir claves de entidad para llamadas TryGetObjectByKey. La idea general para construir la clave de entidad es algo como esto:
internal class Program
{
private static void Main(string[] args)
{
var dc = new AdventureWorksLT2008Entities();
object c;
dc.TryGetObjectByKey(GetEntityKey(dc.Customers, 23), out c);
var customer = c as Customer;
Console.WriteLine(customer.EmailAddress);
}
private static EntityKey GetEntityKey<T>(ObjectSet<T> objectSet, object keyValue) where T : class
{
var entitySetName = objectSet.Context.DefaultContainerName + "." + objectSet.EntitySet.Name;
var keyPropertyName = objectSet.EntitySet.ElementType.KeyMembers[0].ToString();
var entityKey = new EntityKey(entitySetName, new[] {new EntityKeyMember(keyPropertyName, keyValue)});
return entityKey;
}
}
Puede hacer algo similar. Este ejemplo asume un solo campo por EntityKey por simplicidad: para las claves de valores múltiples, necesitaría hacer algo un poco más sofisticado con ObjectSet<T>.ElementType.KeyMembers
y pasar todas sus claves al constructor de EntityKey.
¿Qué sucede si no tiene ningún ChangeTracker.Entries? – ProfK
En mi caso, me enganché en el evento SaveChanges y no deshabilité el seguimiento de cambios. Si su seguimiento de cambios está deshabilitado, entonces la respuesta marcada debería ayudarlo. Si su seguimiento de cambios no está deshabilitado, y tiene un control sobre una entidad, creo que podría sub en mi segunda línea donde puse '(entry.Entity)'. – Bill