Comment obtenir ObjectSet Nom de la clé d'entité?

.net c# entity-framework

Question

J'ai créé un ObjectSet<T> générique ObjectSet<T> dans mon référentiel générique.

Ce que je voudrais obtenir, c'est le name de EntityKey de ObjectSet<T> afin que je puisse l'utiliser dans DataContext.GetObjectByKey .

J'ai cherché et creusé profondément, mais je n'arrive pas à trouver cette valeur dans la classe ObjectSet .

Réponse acceptée

Il y a quelque temps, j'ai cherché un bon moyen de le faire et je n'ai pas réussi à en trouver un. Je finis généralement par créer une méthode d’extension GetEntityByKey quelque part et dans celle-ci, en contenant des chaînes pour créer des clés d’entité pour les appels TryGetObjectByKey. L'idée générale de construction de la clé d'entité ressemble à ceci:

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

Vous pourrez peut-être faire quelque chose de similaire. Cet exemple suppose un seul champ par EntityKey pour des raisons de simplicité. Pour plusieurs clés de valeur, vous devez faire quelque chose de légèrement plus sophistiqué avec ObjectSet<T>.ElementType.KeyMembers et transmettre toutes vos clés au constructeur EntityKey.


Réponse populaire

Générique:

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

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow