如何獲取ObjectSet 的實體密鑰名稱?

.net c# entity-framework

我在我的通用存儲庫中創建了一個通用的ObjectSet<T>

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

我已經四處搜索並深入挖掘,但我似乎無法在ObjectSet類中的任何位置找到此值。

一般承認的答案

我剛才看到了一個很好的方法來做到這一點並沒有找到一個。我通常最終在某處和其中構建一個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構造函數中。


熱門答案

通用:

public class GenericoRepositorio<T> : IGenericoRepositorio<T> where T : class
{
    protected readonly ObjectSet<T> ObjetoSet;
    protected readonly ModeloContainer Contexto;

    public GenericoRepositorio(ModeloContainer contexto)
    {
        Contexto = contexto;
        ObjetoSet = Contexto.CreateObjectSet<T>();
    }

    public T Carregar(int id)
    {
        object objeto;
        Contexto.TryGetObjectByKey(GetEntityKey(ObjetoSet, id), out objeto);
        return (T)objeto;
    }

    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;
    }
}


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因