我已经在通用存储库中创建了通用ObjectSet<T>

我想要获得的是name的EntityKey的ObjectSet<T>,以便可以在DataContext.GetObjectByKey中使用它。

我已经四处搜寻并进行了深入挖掘,但是似乎在ObjectSet类的任何地方都找不到此值。

最佳答案

我前一阵子想办法做到这一点,但没有找到。我通常最终会在其中的某个位置和其中构建一个GetEntityByKey扩展方法,污染字符串以为TryGetObjectByKey调用构建实体键。构建实体 key 的一般思路如下:

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构造函数。

09-11 19:26
查看更多