Mi è sembrato un po 'di tempo fa per un bel modo di farlo e non sono riuscito a trovarne uno. Generalmente finisco per creare un metodo di estensione GetEntityByKey da qualche parte e al suo interno, contatenando le stringhe per creare chiavi di entità per le chiamate TryGetObjectByKey. L'idea generale per la creazione della chiave dell'entità è simile a questa:
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;
}
}
Potrebbe essere possibile fare qualcosa di simile. Questo esempio presuppone un singolo campo per EntityKey per semplicità: per chiavi a valore multiplo è necessario fare qualcosa di leggermente più sofisticato con ObjectSet<T>.ElementType.KeyMembers
e passare tutte le chiavi nel costruttore EntityKey.
fonte
2010-07-25 07:55:57
Cosa succede se non si dispone di alcun ChangeTracker.Entries? – ProfK
Nel mio caso sono stato collegato all'evento SaveChanges e non ho disabilitato il rilevamento delle modifiche. Se il rilevamento delle modifiche è disattivato, la risposta contrassegnata dovrebbe essere di aiuto. Se il rilevamento delle modifiche non è disabilitato e hai un handle su un'entità, penserei che potresti sottometterlo nella mia seconda linea in cui inserisco "(entry.Entity)". – Bill