2011-03-06 6 views
8

Chcę rozszerzyć jednostkę EF w częściowej klasie metodami i właściwościami. Zrobiłem to dość często. Ale teraz musiałbym połączyć dane z tego podmiotu z danymi z innych podmiotów. W związku z tym musiałbym mieć dostęp do obiektu contextcontext (jeśli jest dołączony), aby uzyskać te zapytania. Czy istnieje sposób, aby uzyskać wewnątrz obiektu objectcontext?Entity Framework 4: Dostęp do bieżącego datacontext w częściowej klasie encji

Thanx!

+0

ta doza prawo dźwięku, można wyjaśnić, dlaczego tak się wymagać d? mayby ​​ther jest innym sposobem, aby dostać się tam, gdzie musisz iść (być może stowarzyszenie lub typ złożony) – Menahem

Odpowiedz

2

Nie ma kompilacji w celu uzyskania bieżącego ObjectContext z obiektu. Obiekty oparte na klasie EntityObject i proxy POCO używają wewnętrznie, ale nie ujawniają ich w postaci ObjecContext.

Dodanie takiej zależności do twoich jednostek jest uważane za zły projekt, więc powinieneś wyjaśnić, co próbujesz zrobić i możemy znaleźć inne (lepsze) rozwiązanie.

+0

Witam. Nasze jednostki będą miały własność "List ". Te właściwości są zdefiniowane w meta-strukturze (kilka tabel) w bazie danych. Jeśli ta właściwość encji jest dostępna, musiałbym zebrać strukturę i wartości z bazy danych. Nasz projekt pozwala na rozszerzenie obiektów o "dynamiczne" właściwości. – SolarX

+0

Jednak rozumiem twoją obawę dotyczącą złego projektu .. :) Mogę przenieść to do warstwy biznesowej, ale uważam, że jest to abstrakcja o niskim poziomie, która powinna znajdować się w warstwie trwałości ... – SolarX

2

Nawet jeśli nie jest to zalecane, a ja go nie używać (jak Ladislav stwierdził: zły projekt), natknąłem się na rozwiązanie:

http://blogs.msdn.com/b/alexj/archive/2009/06/08/tip-24-how-to-get-the-objectcontext-from-an-entity.aspx

metodę rozszerzenia:

public static ObjectContext GetContext( 
    this IEntityWithRelationships entity 
) 
{ 
    if (entity == null) 
     throw new ArgumentNullException("entity"); 

    var relationshipManager = entity.RelationshipManager; 

    var relatedEnd = relationshipManager.GetAllRelatedEnds() 
             .FirstOrDefault(); 

    if (relatedEnd == null) 
     throw new Exception("No relationships found"); 

    var query = relatedEnd.CreateSourceQuery() as ObjectQuery; 

    if (query == null) 
     throw new Exception("The Entity is Detached"); 

    return query.Context; 
}

w jednostce

var myContext = this.GetContext() as MyEntities;
+0

Przykładowy kod przykładowy w odpowiedź, na wypadek, gdyby przywołane źródło zniknęło. – Tracker1

+0

Jak pisze autor artykułu, to nie zadziała, jeśli jednostka nie ma relacji. Alternatywnie można to zrobić [poprzez odbicie] (http://stackoverflow.com/a/26212071/111794). –