So erhalten Sie ObjectSet Entitätsschlüsselname?

.net c# entity-framework

Frage

Ich habe in meinem generischen Repository ein generisches ObjectSet<T> .

Was würde Ich mag zu bekommen , ist der name des EntityKey von ObjectSet<T> , so dass ich es in der Verwendung kann DataContext.GetObjectByKey .

Ich habe ObjectSet und tief gegraben, aber ich kann diesen Wert nirgendwo in der ObjectSet Klasse finden.

Akzeptierte Antwort

Ich habe vor einiger Zeit nach einem schönen Weg gesucht und konnte keinen finden. Im Allgemeinen baue ich irgendwo irgendwo eine GetEntityByKey-Erweiterungsmethode auf, in der Strings gebunden werden, um Entity Keys für TryGetObjectByKey-Aufrufe zu erstellen. Die allgemeine Idee zum Erstellen des Entitätsschlüssels lautet in etwa folgendermaßen:

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

Möglicherweise können Sie etwas Ähnliches tun. In diesem Beispiel wird zur Vereinfachung ein einzelnes Feld pro EntityKey vorausgesetzt. Für Schlüssel mit mehreren Werten müssen Sie mit ObjectSet<T>.ElementType.KeyMembers etwas ObjectSet<T>.ElementType.KeyMembers und alle Ihre Schlüssel an den EntityKey-Konstruktor übergeben.


Beliebte Antwort

Generisch:

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

Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum