EntityFramework & SQL Compact 3.5 - VisualStudio bug?


(Djluki) #1

Do aplikacji w WPF chcę wykorzystać bazę danych SQL Compact. Chciałem też wykorzystać Entity Framework.

Wykonałem więc:

  1. Dodałem sobie nowy model Entity (plik *.edmx), stworzyłem w nim tabele i relacje.

  2. Stworzyłem bazę danych SQL Compact i dodałem do projektu.

  3. Wykonałem: "Generate Database from Model"

  4. Visual Studio poprawnie "zobaczył" moją bazę SQL Compact - wskazałem ją.

  5. Przygotował się skrypt DDL, kliknąłem dalej żeby go wykonać.

  6. Skrypt niby się wykonał (Visual Studio nie zgłosił błędu), ale baza danych SQL Compact jest pusta....

Nie mam pojęcia czy ja coś źle robię? Niby wszystko jest ok, Visual Studio bazę widzi a po wykonaniu skryptów powinny się w bazie danych

znaleźć tabele - a tu nic...

Gdyby ktoś mógł pomóc to będę wdzięczny za jakiekolwiek rady jak to ugryźć.

Korzystam z Visual Studio 2010 Express + SQL Compact 3.5


(Tomek Matz) #2

Jesteś pewien, że wykonałeś ten wygenerowany skrypt? Otwórz go w Visual Studio, kliknij w jego obrębie ppm i wybierz Execute SQL. Ja przeprowadziłem u siebie mini test (baza danych składająca się z jednej tabeli) i niby wszystko jest OK (EF 4.3.1 i SQL Server Compact 3.5 SP2).

BTW dlaczego zdecydowałeś się na podejście model-first? Był za tym jakiś konkretny argument? IMO wygodniejszym rozwiązaniem jest najpierw utworzenie bazy danych, a dopiero później wygenerowanie modelu na podstawie tej już istniejącej bazy danych.


(Djluki) #3

Hm... Nie mam takiej opcji.

Wykonuje generowanie, pojawia mi się skrpyt: Model1.edmx.sqlce

W nim są komendy DDL ale nie mam żadnej opcji Excute...

Mam tylko: Run to Cursor - ale nic nie daje. W bazie nie ma żadnych zmian.

Zdecydowałem się na Model-First bo w designerze tworzę sobie bazę od podstaw. Potem mam gotowe skrypty do wdrożenia. Jak zrobię jakieś malutkie zmiany, to nanoszę sobie szybko je w designerze, robię znowu "generate..." i mam gotową bazę. Zadecydowała wygoda. Bazę i tak trzeba zaprojektować bo sama się nie stworzy - a w tym podejściu mogę to elegancko zrobić i szybko poprawić w razie potrzeby. Co dziwne na SQL Express i SQL Standard mój model EDMX wykonuje się bez problemów i wszystko jest dobrze... Sam już nie wiem co jest nie tak...


(Tomek Matz) #4

Ciekawe, może to jakieś ograniczenie wersji Express. Upewnij się, czy na pewno nie masz takiej opcji:

3586vzp.png


(somekind) #5

Sprawdziłem u siebie w VWDE i zwykłej bazie, nie mam opcji Execute, więc to na pewno ograniczenie.


(Tomek Matz) #6

W takim razie nie pozostaje Ci nic innego jak użyć jakiegoś narzędzia do zarządzania tą bazą danych (lista: http://erikej.blogspot.dk/2009/04/sql-compact-3rd-party-tools.html) i z jego poziomu uruchomić ten skrypt SQL.

Jak widzisz na tej liście nie ma SSMS 2012 Express. To nie pomyłka. Microsoft z jakiegoś powodu usunął obsługę SQL Server Compact z poziomu tego programu. Musisz użyć SSMS 2008 R2 Express lub innego programu z tej listy.


(Djluki) #7

Co najśmieszniejsze, z poziomu Database Explorer mogę wykonywać zapytania na bazie SQL Compact ale tylko jednego typu: muszę wybrać rodzaj (SELECT/INSERT/DROP) i otwiera się okienko do pisania skryptów SQL. Tego DDLa nie ma tam jak wykonać zupełnie...

W SSMS 2012 Express nie ma obsługi Compact bo nie ma już takiej bazy danych. SQL Server 2012 zamiast Compact posiada nową odmianę LocalDB - podejrzewam że dlatego usunięto SQLCompact.

-- Dodane 09.07.2012 (Pn) 19:24 --

Skorzystałem z SSMS 2008 R2 Express. Wykonałem skrypty ręcznie i zaczęło działać. Ale... SQL Compact w połączeniu z Entity nie obsługuje wielu podstawowych funkcji ...

Więcej szczegółów na ten temat jest tutaj: http://blog.kzynda.pl/2011/06/entity-fr ... erver.html

Takie rozwiązanie mi więc odpadło.

Zainstalowałem sobie SQL 2008 R2 Express. Sama baza działa elegancko. Problem jest w tym że nie mogę podłączyć bazy do modelu Entity. Bo Visual Studio C# Express nie obsługuje Native Clienta SQL Servera do połączenia... Visual Web Developer Express w pełni obsługuje SQL Native Client - mogę się spokojnie podłączyć do bazy express którą mam na kompie i wszystko działa. W wersji C# jest tylko "Microsoft SQL Server Database File (SqlClient)". Mogę się tym podłączyć do pliku z bazą (wchodzę do katalogu DATA samej bazy danych), ale udało mi się to tylko raz. Teraz dostaję komunikat, że plik jest wykorzystywany przez inny proces - co jest prawdą bo przecież SQL Server z niego korzysta...

Kiepsko to wygląda. Model moge wygenerować ale nie podłącze się do bazy bo C# Express obsługuje tylko dostęp "plikowy" do bazy. Dziwi mnie bardzo że Visual Web Developer ma pełny dostęp przy użyciu SQL Native Clienta a C# Express już nie...

Miał ktoś podobną sytuację? Wie ktoś jak "ominąć" tę niedogodność?


(somekind) #8

Dziwne by było, gdyby było odwrotnie. :slight_smile:


(Tomek Matz) #9

Wow, błyskawicznie wzrosły Ci wymagania ... z SQL Server Compact na SQL Server. Tylko, żeby się nie okazało, że do programu, która ma kilkaset linijek kodu, będzie trzeba instalować takiego kolosa :slight_smile:

Jeśli chodzi o bazy danych, które charakteryzują się małymi wymaganiami, to możesz się jeszcze przyjrzeć SQLite. Być może ta baza danych będzie miała to czego brakowało Ci w SQL Server Compact. Na stronie projektu możesz zapoznać się z możliwościami tej bazy danych http://www.sqlite.org/about.html (warto to zrobić zanim zacznie się z niej korzystać, bo ma ona również sporo ograniczeń).


(Djluki) #10

Dziękuję bardzo :wink:, przekopiowanie ustawień ServerExplorera z Web Dev Studio do Vis Std C# pomogło;) Wygodnie może nie jest ale da się normalnie pracować z entity:)

Co do wymagań:wink: Mój program w tej chwili ma już ponad 3k linijek kodu (sam C#, XAMLa nie liczę:wink:), a nie skończony jest jeszcze system logowania zdarzeń, backup do Azure i pare innych dodatków;) Wydaje mi się, że wybór bazy jest dobry - chciałem korzystać z SQL Compact bo ma powiedzmy "mniejsze wymagania systemowe":wink: Ale miało to być rozwiązanie chwilowe (póki odbiorca mojego programu nie zmodernizuje sprzętu) i docelowo korzystał będę i tak z SQL Express - dlatego chciałem skorzystać z Entity bo potem łatwo przenieść wszystko na inną bazę, bez potrzeby klepania czegoś ręcznie;)

Dziękuję wszystkim za pomoc;)

-- Dodane 10.07.2012 (Wt) 13:04 --

Przy okazji jeszcze (może się komuś przydać):

Jest możliwość skorzystania w sposób normalny z bazy SQL Express w Visual Studio C# Express:

  1. Logujemy się do SSMS.

  2. Znajdujemy pożądaną bazę.

  3. ppm -> Tasks -> Take Offline

  4. Podłączamy się do tej bazy przy pomocy VS C# Express tym connectorem plikowym

(bazy są w katalogu: C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQLEXPRESS\MSSQL\DATA)

Minus tego rozwiązania jest taki że jak chcemy zarządzać bazą w SSMS musimy ponownie ją podłączyć: ppm -> Tasks -> Bring Online i wtedy Visual Studio już nam odmówi posłuszeństwa - jeśli będziemy to chcieli robić na raz;)

-- Dodane 10.07.2012 (Wt) 16:38 --

Dlaczego dziwne? I Visual Web Developer i Visual C# to są wersje Express Edition - instalowane nawet z jednego ISO (jak się pobiera pełny pakiet Express). Dziwne jest czemu wersja dla aplikacji webowych ma obsługę SQL Native Client a dla aplikacji desktopowych już nie... Obie są za darmo, na identycznej licencji. Dziwna sprawa.