J'ai regardé il y a un moment pour un bon moyen de le faire et je n'ai pas réussi à en trouver un. Je finis généralement par construire une méthode d'extension GetEntityByKey quelque part et dedans, contatenating des chaînes pour construire des clés d'entité pour les appels TryGetObjectByKey. L'idée générale pour construire la clé d'entité va quelque chose comme ceci:
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;
}
}
Vous pouvez faire quelque chose de similaire. Cet exemple suppose un seul champ par EntityKey pour plus de simplicité - pour les clés à valeurs multiples, vous devrez faire quelque chose de légèrement plus sophistiqué avec ObjectSet<T>.ElementType.KeyMembers
et transmettre toutes vos clés dans le constructeur EntityKey.
Que faire si vous n'avez pas de ChangeTracker.Entries? – ProfK
Dans mon cas, j'ai été accroché dans l'événement SaveChanges et je n'ai pas désactivé le suivi des modifications. Si votre suivi des modifications est désactivé, la réponse marquée devrait vous aider. Si votre suivi des modifications n'est pas désactivé, et que vous avez un contrôle sur une entité, je pense que vous pourriez le sous-traiter dans ma deuxième ligne où je mets '(entry.Entity)'. – Bill