No to mam solucję z podziałem na projekty:
Data – DbContext
Entities – Model danych
Web – aplikacja web.
Na początek dodaję do ConfigureService w Startup.cs linijkę:
services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer( Configuration.GetConnectionString("DefaultConnection"), x => x.MigrationsAssembly("Data")) );
ale podczas wykonania polecenia w PowerShellu dostaję błąd:
Unable to create an object of type ‚ApplicationDbContext’. Add an implementation of ‚IDesignTimeDbContextFactory
at design time.
Dopiero dodanie klasy DesignTimeDbContextFactory dziedziczącej po interfejsie IDesignTimeDbContextFactory rozwiązało problem. Klasa musi być utworzona w projekcie, w którym istnieje klasa DbContextu.
public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory<ApplicationDbContext> { public ApplicationDbContext CreateDbContext(string[] args) { IConfigurationRoot configuration = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json") .Build(); var builder = new DbContextOptionsBuilder<ApplicationDbContext>(); var connectionString = configuration.GetConnectionString("DefaultConnection"); builder.UseSqlServer(connectionString); return new ApplicationDbContext(builder.Options); } }
Podczas implementacji zabrakło mi metody SetBasePath w ConfigurationBuilder i dopiero doinstalowanie pakietu Microsoft.Extensions.Configuration.Json rozwiązało problem.
Potem już tylko dobranie się do appsettings.json w projekcie Web:
IConfigurationRoot configuration = new ConfigurationBuilder() .SetBasePath(Path.Combine(Directory.GetCurrentDirectory(), @"..\Web\")) .AddJsonFile(@"appsettings.json") .Build();
I polecenie:
dotnet ef migrations add "Initial" -o Migrations
Zadziałało, pliki zostały utworzone, a więc wykonuję:
I polecenie:
dotnet ef database update
I kolejny błąd:
Could not load file or assembly ‚System.Data.SqlClient, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3
a’. Nie można odnaleźć określonego pliku.
Zatem dodaję paczkę newgetową: System.Data.SqlClient
ZADZIAŁAŁO!!! Baza została utworzona.
Ważne żeby pamiętać o przekompilowaniu solucji po każdej zmianie!
Każda zmiana modelu wymaga:
dotnet ef migrations add TestMigration - gdzie TestMigration to nazwa kolejnej migracji dotnet ef database update