.net Core / c# / Entity Framework

Enity Framework Core – Code First – aktualizacja modelu z innego projektu

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‚ to the project, or see https://go.microsoft.com/fwlink/?linkid=851728 for additional patterns supported
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

Leave a Reply

Your email address will not be published. Required fields are marked *