Ich sah vor einer Weile für eine nette Möglichkeit, dies zu tun und konnte nicht finden. Im Allgemeinen erstelle ich am Ende eine GetEntityByKey-Erweiterungsmethode und bringe damit die Strings zusammen, um Entity Keys für TryGetObjectByKey-Aufrufe zu erstellen. Die allgemeine Idee zum Erstellen des Entitätsschlüssels lautet etwa folgendermaßen:
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;
}
}
Möglicherweise können Sie etwas Ähnliches tun. In diesem Beispiel wird zur Vereinfachung ein einzelnes Feld pro EntityKey vorausgesetzt - für Schlüssel mit mehreren Werten müssten Sie etwas anspruchsvolleres mit ObjectSet<T>.ElementType.KeyMembers
machen und alle Ihre Schlüssel in den EntityKey-Konstruktor übergeben.
Was ist, wenn Sie keine ChangeTracker.Entries haben? – ProfK
In meinem Fall wurde ich in das Ereignis SaveChanges eingebunden und deaktivierte das Änderungs-Tracking nicht. Wenn Ihre Änderungsverfolgung deaktiviert ist, sollte Ihnen die markierte Antwort helfen. Wenn Ihre Änderungsverfolgung nicht deaktiviert ist und Sie eine Entität verwalten, würde ich meinen, dass Sie diese in meiner zweiten Zeile subtrahieren könnten, wo ich '(entry.Entity)' eingegeben habe. – Bill