Некоторое время назад я искал хороший способ сделать это и не смог его найти.Я обычно заканчиваю тем, что где-то и внутри него создаю метод расширения GetEntityByKey, связывающий строки для построения ключей сущностей для вызовов TryGetObjectByKey.Общая идея построения ключа сущности выглядит примерно так:
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;
}
}
Возможно, вы сможете сделать что-то подобное.В этом примере предполагается простота одного поля на EntityKey - для ключей с несколькими значениями вам нужно будет сделать что-то более сложное с ObjectSet<T>.ElementType.KeyMembers
и передать все ключи в конструктор EntityKey.