2017-02-13 30 views
9

Mam problemy z dodaniem początkowej migracji do kontekstu mojej bazy danych Entity Framework wewnątrz biblioteki klasy .NET Core..NET Core Entity Framework - Dodaj migrację do kontekstu w bibliotece klas

Kiedy biegnę:

dotnet ef migrations add migrationName -c PlaceholderContext 

otrzymuję błąd:

Could not invoke this command on the startup project 'Placeholder.Data'. This version of the Entity Framework Core .NET Command Line Tools does not support commands on class library projects in ASP.NET Core and .NET Core applications. See http://go.microsoft.com/fwlink/?LinkId=798221 for details and workarounds. 

więc kliknąłem na link i dowiedział się, że to nie jest możliwe, aby dodać migrację do biblioteki klas. Możesz jednak przekonwertować projekt biblioteki klas do projektu "aplikacji", ale nie mogę odwołać się do tego projektu "aplikacji" z mojej warstwy biznesowej (biblioteki klas).

struktura Projekt:

Placeholder.Web (WebAPI) =>Placeholder.Business (Class Library) =>Placeholder.Data (Class Library)

Project structure

Placeholder.Web => Startup.cs

public void ConfigureServices(IServiceCollection services) 
    { 
     // Add framework services. 
     services.AddApplicationInsightsTelemetry(Configuration); 

     services.AddMvc(); 

     //HERE WE REGISTER DB CONTEXT, (STATIC CLASS IN BUSINESS LAYER) 
     services.InjectBusinessContext(@"Data Source=(localdb)\ProjectsV13;Initial Catalog=Placeholder;Integrated Security=True;Connect Timeout=30;"); 

     services.InjectWebServices(); 
     services.InjectBusinessServices(); 
    } 

Jak mogę rozwiązać ten naprawdę irytujący problem?

Aktualizacja (1)

Mam przeliczone moja klasa Placeholder.Data bibliotekę do „aplikacji” z metody statycznej głównego. Ponieważ nie mogę już odwoływać się do Placeholder.Data od Placeholder.Business Muszę iść z obejściem 2 wymienionym na stronie dokumentu Microsoft. Kiedy teraz uruchomić skrypt migracji uzyskać następujące:

No database provider has been configured for this DbContext. A provider can be configured by overriding the DbContext.OnConfiguring method or by using AddDbContext on the application service provider. If AddDbContext is used, then also ensure that your DbContext type accepts a DbContextOptions object in its constructor and passes it to the base constructor for DbContext

Doh Oczywiście to przyzwyczajenie pracy, dbcontext jest zarejestrowany od mojego Placeholder.Web aplikacji (poprzez warstwy biznesowej). Wtedy moją jedyną opcją jest dodanie nowego kontekstu w nowej statycznej metodzie głównej i naprawdę nie chcę tego robić.

Odpowiedz

6

Nie trzeba "konwertować" projektu danych do aplikacji. Tutaj jest app testu o podobnej strukturze:

project structure

W project.json w projekcie danych, dodaj pakiety Nuget podstawowych asp.net.

project.json

Teraz, aby utworzyć migracji, kliknij prawym przyciskiem myszy na projekcie Danych wybierz „Otwórz folder, w eksploratora plików”, a następnie w Eksploratorze plików „otwarte okno poleceń Naciśnij Shift + kliknięcie prawym przyciskiem myszy i tutaj. "

Aby utworzyć migracji, po prostu określić '' jako projekt uruchomienia aplikacji internetowej (jeśli istnieje startup.cs)

dotnet ef --startup-project ../TestPatterns2.Web migrations add Second 

migrations

I voila, migracja:

second migration

DODAWANIE FOLDERU MIGRACJI DO PROJEKTU DANYCH: po zdefiniowaniu usługi ce, dodać punkt migracji jak tak

services.AddDbContext<ApplicationDbContext>(options => 
      options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"), b => b.MigrationsAssembly("TestPatterns2.Data"))); 
+0

Spróbuję tego później, kiedy wrócę do domu! – Reft

+0

proszę oznaczyć jako odpowiedź, jeśli to działa. Jeśli chcesz pójść o krok dalej, możesz również rozszerzyć IServiceCollection w projekcie biblioteki klas DATA i dodać DI i ciągi połączeń w nim, aby projekt WWW był całkowicie niezależny od projektu DATA. – Reza

+0

Przepraszamy za spóźnioną odpowiedź, po prostu wypróbowaliśmy twój kod i działa, okrzyki. Ale! Jeśli spojrzysz na moją strukturę projektu, mam utworzony przez siebie folder o nazwie migracje. Kiedy uruchamiam polecenie, otrzymuję nowy folder migracji w katalogu głównym? 1. Czy mogę to zmienić? 2. Jeśli chcę dodać więcej migracji po pierwszej migracji początkowej, czy muszę ponownie wykonać te kroki lub utworzyć normalny sposób za pomocą konsoli menedżera pakietów? – Reft

1

Musi to być tylko aplikacja do migracji (wymaga punktu wejścia), więc po zrobieniu w bibliotece aplikacji i przy tworzeniu migracji skomentuj elementy buildOptions i runtimes w pliku project.json. Zbuduje się teraz ponownie jako biblioteka.

Odkomentuj je, gdy zachodzi potrzeba dodania kolejnej migracji.

+0

próbowałem konwersji z „netstandard1.6” na „netcoreapp1.0”, ale jestem coraz .DATA nie jest kompatybilny z netstandard1.6. – Reft

+0

Ok, musiałem zwolnić warstwę biznesową, (odwołanie), a następnie zadziałało. Przekształciłem bibliotekę zajęć w aplikację. Ponieważ nie mogę odwołać się do .Data z .Business jestem zmuszony iść z Workaround 2. Wydaje się, że muszę zarejestrować kontekst przy użyciu głównej metody w .Data? Nie chcę tego robić. – Reft

+0

@Reft Rozwiązanie, którego użyłem, to zadeklarowanie DBFactory zamiast tego. Nie pamiętam jednak, jak napisałem post na blogu, przepraszam. – BradleyDotNET