28

Zmieniłem mój DAL z używania LINQ na Entity Framework. Ponieważ moja aplikacja łączy się z różnymi bazami danych w zależności od bieżącego użytkownika, muszę dynamicznie utworzyć DataContext w czasie wykonywania i przekazać odpowiedni ciąg połączenia. Jednak gdy próbowałem programowo utworzyć połączenie Entity Framework przy użyciu mojego starego ciągu połączenia, połączenie nie powiodło się. Zarzucił, że nie rozpoznał klucza w łańcuchu połączenia, dokładniej "serwer".Dlaczego połączenie Entity Framework wymaga właściwości metadanych?

I okazało się, że muszę to zrobić w celu uzyskania połączenia Entity Framework do pracy:

EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder(); 
entityBuilder.Provider = "System.Data.SqlClient"; 
entityBuilder.ProviderConnectionString = clientConnectionString; 
entityBuilder.Metadata = "res://*/xxxxxxxxxx.csdl..."; 
Entities entities = new Entities(entityBuilder.ToString()); 

Dlaczego tak jest?
Do czego służy właściwość metadane?
Czy to będzie problem, który zawsze będzie taki sam dla wielu różnych połączeń?
Co powinno być?
Czy jest jakiś sposób obejścia tego?

Z góry dziękuję!

Aktualizacja 1: Dzięki za aktualizację Randolpho, ale ...
Cały powód mam ten problem, że nie mogę zapisać ciągów połączenia w pliku konfiguracyjnym. Ciąg połączenia jest określany dynamicznie w czasie wykonywania, z którym użytkownik łączy się.

Oto mój dokładny scenariusz:
Jeśli użytkownik A łączy, aplikacja pobiera dane z bazy danych A. Jeśli użytkownik B łączy, aplikacja pobiera dane z bazy danych B.
Ciągi połączeń są przechowywane w głównym baza danych, a liczba jest potencjalnie nieograniczona. Za każdym razem, gdy dodaję użytkownika, nie chcę iść do web.config, nie wspominając już o tym, że w końcu dostanie OGROMNĄ!

+0

Ponieważ odwzorowania są takie same dla każdego połączenia i nie ulegnie zmianie, nie powinno mieć znaczenia, że ​​używam tych samych metadanych dla nich wszystkich, prawda? –

+0

tak, to jest poprawne – user230910

Odpowiedz

9

Znajdziesz te linki bardzo pouczające:

http://msdn.microsoft.com/en-us/library/system.data.entityclient.entityconnection.connectionstring.aspx

http://weblogs.asp.net/pgielens/archive/2006/08/21/ADO.NET-Entity-Framework-Metadata.aspx

Konkluzja? Entity Framework potrzebuje metadanych do zbudowania mapowań encji.

Dodatkowo należy rozważyć przeniesienie informacji o połączeniu do pliku konfiguracyjnego, zamiast budować go w kodzie. Pierwszy link pokaże Ci, jak to zrobić.

+2

@ocdecio: Nie dyskontuj EF tylko za to; NHibernate działa w podobny sposób. Jestem pewien, że są jeszcze inne powody. :) – Randolpho

+2

@ocdecio, bardzo chciałbym zobaczyć mapera ORM, który nie używa jakiegoś pliku odwzorowania. Chyba, że ​​robisz 1: 1 przy stołach, coś musi coś powiedzieć, co. – jfar

24

Rozszerzając Randolpho za odpowiedź:

Obiekt metadanych konkretnie wskazuje lokalizacji .SSDL (Storage Model,) .CSDL (model koncepcyjny,) i .MSL (mapowanie modelu) plików. Te trzy pliki to zasadniczo model danych jednostki. Kwalifikator stylu "res: //" wskazuje, że pliki są osadzone jako zasoby w skompilowanym zestawie EDM.

Powiązane problemy