6

Muszę zaktualizować istniejącą witrynę opartą na DDS nad strukturą Entity Framework i wykorzystuje trzy różne modele baz danych z trzech różnych baz danych. To, czego potrzebuje, to prosty dodatek do strony ListDetails: przycisk eksportu do XML ...
Dodanie przycisku jest łatwe. Tworzenie kodu XML również nie jest trudne. Wyzwanie polega na uzyskaniu odpowiedniej tabeli do wyeksportowania, przejrzenia wszystkich rekordów i pól oraz wygenerowania XML na podstawie dowolnej ze 100 tabel w systemie!
Tak więc mój przycisk wywołuje procedurę obsługi eksportu (ashx), która generuje XML na podstawie tabeli, której nazwę otrzymuje za pośrednictwem parametrów. Kod, który mam, jest mniej więcej taki:Eksport do XML z witryny dynamicznych danych

 Content_CobaEntities Coba = new Content_CobaEntities(); 
     MetadataWorkspace metadataWorkspace = Coba.MetadataWorkspace; 
     EntityContainer container = metadataWorkspace.GetItems<EntityContainer>(DataSpace.CSpace).First(); 
     string namespaceName = metadataWorkspace.GetItems<EntityType>(DataSpace.CSpace).First().NamespaceName; 
     EntitySetBase entitySetBase = container.BaseEntitySets.FirstOrDefault(set => set.ElementType.Name == Entity); 

Niestety, działa to tylko w jednym kontekście i mam trzy. (Ale ten jest głównym kontekstem.) (Poza tym drugi parametr może być użyty do określenia właściwego kontekstu.) I chociaż pozwala mi to określić typ jednostki, który jest potrzebny, nadal nie zapewni mi dostępu do jego rekordów. i pola.

Jak uzyskać dane dla tego obiektu? (Filtry nie są ważne, eksport zwróci wszystkie dane.)

I nie, bez EF4. Nie .NET 4. Jest to starszy projekt VS2008 i nie mogą być modyfikowane za dużo, ani nie może być zmodernizowane ...


Zasadniczo querystring zawiera dwa parametry: ContextID i QueryID. ContextID informuje mnie, z którego kontekstu korzystać, a ponieważ mam tylko trzy różne konteksty, proste polecenie przełączające rozwiązuje to dla mnie. Ale jeden z kontekstów zawiera ponad 60 zapytań, z których każdy jest powiązany z jedną tabelą bazy danych. Dynamiczna strona danych zapewnia mi opcje dodawania, edytowania i usuwania rekordów z tej tabeli, ale musi zostać wyeksportowana w formacie określonym przez mój niestandardowy kod. Ale w przypadku 60 tabel zbyt wiele jest do napisania instrukcji switch dla każdego zapytania, więc potrzebuję czegoś bardziej ogólnego.

+0

Czy mówisz, że nie możesz połączyć się z innym kontekstem EF innym niż główny kontekst? – WVDominick

+0

W rzeczywistości program obsługi wywozu musi być również dostępny z innych lokalizacji, a użytkownicy muszą mieć możliwość dodania go do zakładek. Mogę uzyskać odpowiedni kontekst, ale teraz muszę przejść przez właściwe zapytanie, z wszystkimi polami i wartościami, aby wygenerować niestandardowy kod XML. –

Odpowiedz

2

Jak się okazuje, zrobiłem rzeczy bardziej skomplikowane niż potrzeba ... zacznę z parametrami:

 string Entity = context.Request.QueryString.Get("Entity"); 
     string ContextID = context.Request.QueryString.Get("Context"); 

Potem trzeba określić odpowiedni kontekst do stosowania, które jest łatwe:

 ObjectContext Context; 
     if (ContextID.Contains("Content_LogEntities")) { Context = new Content_LogEntities(); } 
     else if (ContextID.Contains("Content_CobusEntities")) { Context = new Content_CobusEntities(); } 
     else { Context = new Content_CobaEntities(); }; 

Następnie muszę uzyskać prawidłowe dane w żądanej tabeli. Również łatwe:

 ObjectQuery Tabel = Context.CreateQuery<EntityObject>(string.Format("[{0}]", Entity)); 

Nie wiem, dlaczego próbowałem uczynić tę część bardziej skomplikowaną niż potrzebna.

Co pozostaje, to przechodząc przez wszystkie pola, ale mam refleksję obejście:

 foreach (var rec in Tabel) 
     { 
      foreach (PropertyInfo Prop in rec.GetType().GetProperties()) 
      { 
       // Blah 
      } 
     } 

Blah-część sprawdza Prop.Name Aby sprawdzić, czy jest to kluczowy podmiot państwowy podmiot, kolekcja dziecko lub odniesienia lub jeśli to tylko pole danych. To pozwala mi generować praktyczne wyjście XML.