Słowo kluczowe nie jest obsługiwane: „źródło danych” inicjuje kontekst Entity Framework

161

Inicjalizuję kontekst obiektu Entity Framework, a to daje mi słowo kluczowe nieobsługiwane błąd:

metadata=res://*/MainDB.csdl|res://*/MainDB.ssdl|res://*/MainDB.msl;provider=System.Data.SqlClient;provider connection string="Data Source=.\SQLEXPRESS;AttachDbFilename=D:\Workspace\vs\Leftouch\Leftouch.Web\Data\Leftouch.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True;App=EntityFramework"

Wziąłem parametry połączenia bezpośrednio z działającego web.config i zmodyfikowałem tylko ścieżkę do pliku (którą ustawiłem dynamicznie) i zamiast używać wartości domyślnej, jawnie użyłem tego ciągu połączenia. Co może spowodować ten błąd?

Can Poyrazoğlu
źródło
2
Zapoznaj się ze stackoverflow.com/questions/6003085/…, aby uzyskać inne podejście
LCJ,
1
Nie wiem, kto wpadł na ten metadata=res:, a następnie res=somethingelsez "całym składni miejsce - ale powinny one być naprawdę zadowolony, że nie są w tym samym pokoju co ja teraz: - /
Simon_Weaver
2018 .NET EF Core podobny błąd składni - nazwa dostawcy nie była wymagana przez parametry połączenia SqlClient. Również brak cudzysłowów ani znaczników w ciągu dla rdzenia EF.
Sql Surfer

Odpowiedzi:

322

Prawdziwym powodem, dla którego otrzymujesz ten błąd, są "wartości w parametrach połączenia.

Jeśli zastąpisz je pojedynczymi cudzysłowami, będzie działać dobrze.

https://docs.microsoft.com/archive/blogs/rickandy/explicit-connection-string-for-ef

(Wysłano, aby inni mogli rozwiązać problem szybciej niż ja).

Vaccano
źródło
1
Jeśli przekazujesz parametry połączenia do klasy ObjectContent, upewnij się, że zawiera ona pojedyncze cudzysłowy. Jeśli otrzymujesz połączenie z pliku .config, możesz użyć opcji & bdquo; sekwencja ewakuacyjna.
Mike Stonis
To właśnie naprawiło to dla mnie.
GiddyUpHorsey
Dla tych, którzy nie wiedzą, jak działa XML, "jest to sekwencja ucieczki dla cudzysłowu, ponieważ jest to zastrzeżony znak XML.
Vivian River
1
Dzięki, że działa teraz
Shivam Srivastava
System.Data.EntityClient.EntityConnectionStringBuilder zrobił to dla mnie, dziękuję.
AFract
37

Naprawiłem to, zmieniając się z EntityClientpowrotem na SqlClient, mimo że korzystałem z Entity Framework.

Więc moje kompletne parametry połączenia były w formacie:

<add name="DefaultConnection" connectionString="Data Source=localhost;Initial Catalog=xxx;Persist Security Info=True;User ID=xxx;Password=xxx" providerName="System.Data.SqlClient" />
Brutalny
źródło
2
Pracował dla mnie! +1
Yury Kerbitskov
6
Powyższa zmiana potencjalnie doprowadzi do (tak jak w moim przypadku) następującego błędu "Kontekst jest używany w trybie Code First z kodem wygenerowanym z pliku EDMX dla rozwoju Database First lub Model First"
Psi-Ed
Możesz skomentować zgłoszenie nowego UnintentionalCodeFirstException () w OnModelCreating (), ale wygląda to na brudne obejście
Alexander Ulmaskulov
14

Wydaje się, że brakuje tego providerName="System.Data.EntityClient"bitu. Jasne, że masz wszystko?

Craig Stuntz
źródło
Ok, to był kolejny atrybut, zapomniałem o tym. Dodano, teraz jest metadata=res://*/MainDB.csdl|res://*/MainDB.ssdl|res://*/MainDB.msl;provider=System.Data.SqlClient;provider name=System.Data.EntityClient;provider connection string=&quot;{0};App=EntityFramework&quot;i teraz mówi, że klucz nie został znaleziony: nazwa dostawcy. providerName=...Zamiast tego też próbowałem provider name=, ale bez powodzenia.
Can Poyrazoğlu
2
Cóż, zacząłem go tworzyć za pomocą EntityConnectionStringBuilderklasy i, co dziwne, teraz działa. Ale nadal nie mam pojęcia, dlaczego nie zaakceptował mojego ciągu, nawet z twoimi dodatkami.
Can Poyrazoğlu
3

Wierz lub nie, zmiana nazwy LinqPad.exe.config na LinqPad.config rozwiązała ten problem.

Sameer Alibhai
źródło
12
To jest Microsoft, wszystko może się zdarzyć!
Altaf Patel
To nie ma sensu. Co Linqpad ma wspólnego z tym pytaniem i jak zmiana nazwy pliku wykonywalnego może być kiedykolwiek pomocna?
Gert Arnold
Cóż, ten konkretny błąd wystąpił w Linqpad w moim przypadku i wykonanie tego rozwiązało problem. I nie zmieniłem nazwy pliku wykonywalnego. Zmieniłem nazwę pliku .exe.config na .config.
Sameer Alibhai
W każdym razie to bardzo specyficzny scenariusz. Dodaje tylko hałas, ponieważ niczego nie wyjaśnia
Gert Arnold,
1

Po prostu użyj \ "zamiast", to powinno rozwiązać problem.

Nilesh Moradiya
źródło
1

Upewnij się, że masz parametry połączenia, Data Sourcea nie DataSource. Przestrzeń jest ważna. Zaufaj mi. Jestem idiotą.

Hairgami_Master
źródło