19

Stworzyłem model Entity Framework oparty na istniejącej bazie danych, a następnie wygenerowałem jednostki POCO z modelu. Ciąg połączenia w moim pliku web.config nie jest strukturą Entity, to tylko standardowy ciąg połączenia (brakuje w nim referencji CSDL, SSDL, MSL).Code First vs. Database First

mogę skompilować mojej aplikacji, ale gdy uruchamiam otrzymuję ten błąd:

Code generated using the T4 templates for Database First and Model First development may not work correctly if used in Code First mode. To continue using Database First or Model First ensure that the Entity Framework connection string is specified in the config file of executing application. To use these classes, that were generated from Database First or Model First, with Code First add any additional configuration using attributes or the DbModelBuilder API and then remove the code that throws this exception


Moje pytanie brzmi, gdzie w kodzie to zrealizować Poços pochodził z pokolenia auto i jak można Rozumiem, że zachowuje się jak Code First? Nie chcę odwoływać się do CSDL itp. W łańcuchu połączenia.

+0

to źle, że musisz najpierw użyć zarówno modelu, jak i kodu ... – Serdar

+1

@Serdar - Niekoniecznie. Może zacząć generować kod ze znanego modelu, ale od tego momentu zacznij używać najpierw kodu, aby napisać nowy kod. –

+0

Właśnie dostałem to ... przepraszam ... – Serdar

Odpowiedz

23

Jeśli ciąg połączenia zawiera metadane, EF myśli, że jest to Model First lub Database First. Jeśli jest to zwykły ciąg połączenia, EF myśli, że jest to Code First. Jeśli jednak chcesz najpierw zacząć robić model, ale EF myśli, że naprawdę robisz kod pierwszy (co robisz), upewnij się, że używasz generatora kodu DbContext, a nie domyślnego. Najpierw kod POCO to tak naprawdę "zwykłe stare obiekty C#" - żadna specjalna baza danych nie jest świadoma ani nie zmienia w nich żadnych elementów śledzenia. Aby użyć generatora kodu DbContext, kliknij prawym przyciskiem myszy na diagramie modelu i wybierz "Dodaj nowy element generowania kodu ...", a następnie wybierz ADO.NET DbContext Generator. Ponadto, w zależności od tego, jak nazwałeś swoje klucze podstawowe i obce i/lub czy są one bardziej skomplikowane niż tylko proste identyfikatory int, prawdopodobnie będziesz musiał wpisać jakiś kod, aby odwzorować relacje między twoimi obiektami w metodzie "OnModelCreating" w twoim kontekst. Usuń linię throw new UnintendedCodeFirstException(); i zastąp ją swoim kodem odwzorowania. W przeciwnym razie EF może nie być w stanie określić wszystkich relacji (pamiętaj, że nie ma metadanych, na których można polegać).

Mam nadzieję, że to pomoże.

+0

Twoja odpowiedź pomogła mi. I umieściłem Twój odnośnik w moim pytaniu/odpowiedzi @ http://stackoverflow.com/questions/18674079/ef-5-0-database-first-model-not-working-on-one-table/18675388#18675388 Dziękuję – HGMamaci

+0

@HGM Cieszę się, że ta odpowiedź była przydatna. –

12

potrzebne są następujące elementy w pliku konfiguracyjnym:

<connectionStrings> 
<add name="<The name of your class>" 
    connectionString="metadata=res://*/<test>.csdl|res://*/<test>.ssdl|res://*/<test>.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=<your source>;initial catalog=<your db>;persist security info=True;user id=<your user id>;password=<your password>;multipleactiveresultsets=True;App=EntityFramework&quot;" 
    providerName="System.Data.EntityClient" /> 
</connectionStrings> 
+0

Cześć John, Dziękuję bardzo. Twoja odpowiedź zadziałała dobrze. –

+0

jeśli przełączasz metodę connectionString ze źródła danych (localdb) na źródło danych SQL, użyj tego rozwiązania. np. jeśli obecnie podajesz rzeczywistą nazwę serwera dla źródła danych, to rozwiązanie jest drogą do zrobienia. –

0

ja najpierw za pomocą bazy danych i rozwiązać ten kopiując EDMX wygenerowany ciąg połączenia do app.config mojej aplikacji startowej. Jeden już istniał, ale najwyraźniej były różne