2010-12-08 2 views
7

Czy ktoś wie, w jaki sposób uzyskać informacje o schemacie z edytora edmx Entity Framework?Odczytaj metadane klucza obcego programowo za pomocą Entity Framework 4

W szczególności chcę poradzić sobie z kluczem obcym dla podmiotu, którego obecnie nie posiadam i uzyskać jego kluczowe relacje zagraniczne, i chcę to zrobić poprzez odbicie w sposób, który będzie generalnie stosowane do każdej klasy encji bez niestandardowego kodu za każdym razem.

EG: Mój schemat ma 2 klasy, użytkownika i grupę. Mam numer "42", o którym wiem, że pochodzi z właściwości "GroupId" jednostki "User", ale w tej chwili nie mogę znaleźć sposobu, aby wykryć, że ta właściwość "GroupId" obcego klucza "User" do encja "Grupa" według jej właściwości "GroupId".

Odpowiedz

7

Skończyło się znalezienie rozwiązania tego. Odpowiednie informacje można znaleźć w kontekście: właściwość RelationshipManager. Wzywając GetAllRelatedEnds(), a następnie znajdując te z rodzaju AssociationSet.

ElementType regionu zestaw zawiera więc właściwość IsForeignKey a także tablicę ReferentialConstraints który ma właściwości dla każdego ograniczenia ToRole, ToProperty, FromRole i FromProperty odpowiednio, a RelationshipMultiplicity na ToRole/FromRole mogą być wykorzystywane do określenia kierunku relacji klucza obcego.

Wszystkie te dane i przy użyciu metody kontekstu GetObjectByKey udało mi się programowo przejść przez relacje klucza obcego zdefiniowane dla kontekstu bez powiązanego obiektu.

+1

nie mogę uzyskać to do pracy. Nie mogłem znaleźć właściwości RelationshipManager w kontekście (chociaż mogę uzyskać ją przez CType (tableObject, IEntityWithRelationships) .RelationshipManager), a następnie po wykonaniu tej czynności nie mogłem znaleźć wyników z GetRelatedEnds, które mogłyby zostać przesłane do AssociationSet. Przykład kodu byłby głęboko doceniony. – pbarranis

+1

Hej, przepraszam za opóźnioną odpowiedź - nie czytałem tego od dłuższego czasu. Powinienem był bardziej jasne, że pracuję z ObjectStateEntry, a nie bezpośrednio z kontekstu. Dokładna składnia, z której korzystałem, to "foreach" (AssociationSet assoc w ose.RelationshipManager.GetAllRelatedEnds(). Wybierz (end => end.RelationshipSet) .Where (rs => rs to AssociationSet && ((AssociationSet) rs) .ElementType. IsForeignKey) .Cast ()) ", następnie miałem trochę dodatkowej logiki, aby ustalić, po której stronie był, ponieważ chciałem tylko specyficznych multiplikacji kluczy obcych. – fyjham

21

Można używać następujące podejście -

foreach (EntityType entity in ItemCollection.GetItems<EntityType>().OrderBy(e => e.Name)) 
foreach (var entityMember in entity.NavigationProperties) 
foreach (System.Data.Metadata.Edm.EdmProperty foreignKey in entityMember.GetDependentProperties()) 
{ 
    //... use foreignKey 
} 
+2

Doskonały - dziękuję! Nie wiem, jak uzyskać odpowiedź plakatu na pracę, ale twoja pracowała za pierwszym razem. A + również dla przykładu kodu! – pbarranis

+2

Po prostu świetnie. Nie tylko dlatego, że znalezienie odpowiednich informacji na ten temat w Google jest niezwykle trudne. –

+0

To samo tutaj. Dziękuję Ci! –