Megosztás:


Tervezésre kész DbContext létrehozása

Az EF Core Tools egyes parancsai (például a Migrálási parancsok) megkövetelik , hogy a tervezéskor származtatott DbContext példányt hozhasson létre az alkalmazás entitástípusairól és az adatbázisséma leképezésének módjáról. A legtöbb esetben kívánatos, hogy az DbContext így létrehozott konfigurálás a futásidőben történő konfigurálás módjához hasonlóan legyen konfigurálva.

Az eszközök többféleképpen próbálják létrehozni a következőt DbContext:

Alkalmazásszolgáltatásokból

Ha az indítási projekt a ASP.NET Core Web Host vagy a .NET Core Generic Gazdagépet használja, az eszközök megpróbálják beszerezni a DbContext objektumot az alkalmazás szolgáltatójától.

Az eszközök először megpróbálják beolvasni a szolgáltatót a tulajdonság meghívásával Program.CreateHostBuilder(), hívásával Build(), majd elérésével Services .

public class Program
{
    public static void Main(string[] args)
        => CreateHostBuilder(args).Build().Run();

    // EF Core uses this method at design time to access the DbContext
    public static IHostBuilder CreateHostBuilder(string[] args)
        => Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(
                webBuilder => webBuilder.UseStartup<Startup>());
}

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
        => services.AddDbContext<ApplicationDbContext>();

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
    }
}

public class ApplicationDbContext : DbContext
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    {
    }
}

Note

Új ASP.NET Core-alkalmazás létrehozásakor a rendszer alapértelmezés szerint ezt a horgot tartalmazza.

Magát DbContext és a konstruktorban lévő függőségeket szolgáltatásként kell regisztrálni az alkalmazás szolgáltatójában. Ez könnyen megvalósítható, ha egy konstruktort használ az DbContext argumentumként használt példányonDbContextOptions<TContext>, és használja a metódustAddDbContext<TContext>.

Konstruktor használata paraméterek nélkül

Ha a DbContext nem kérhető le az alkalmazásszolgáltatótól, az eszközök a projekten belül keresik a származtatott típust DbContext . Ezután megpróbálnak létrehozni egy példányt paraméterek nélküli konstruktor használatával. Ez lehet az alapértelmezett konstruktor, ha a DbContext metódussal OnConfiguring van konfigurálva.

Tervező-idő gyárból

A dbContext létrehozásához szükséges eszközöket a felület implementálásával Microsoft.EntityFrameworkCore.Design.IDesignTimeDbContextFactory<TContext> is megadhatja: Ha az interfészt megvalósító osztály vagy ugyanabban a projektben található, mint a származtatott DbContext vagy az alkalmazás indítási projektje, az eszközök megkerülik a DbContext létrehozásának egyéb módjait, és ehelyett a tervezési idejű gyárat használják.

public class BloggingContextFactory : IDesignTimeDbContextFactory<BloggingContext>
{
    public BloggingContext CreateDbContext(string[] args)
    {
        var optionsBuilder = new DbContextOptionsBuilder<BloggingContext>();
        optionsBuilder.UseSqlite("Data Source=blog.db");

        return new BloggingContext(optionsBuilder.Options);
    }
}

A tervezési idő gyár különösen akkor lehet hasznos, ha a tervezési időt eltérően kell konfigurálnia DbContext , mint a futásidőben, ha a DbContext konstruktor további paramétereket vesz fel a DI-ben, ha egyáltalán nem használ DI-t, vagy ha valamilyen okból nem szeretne metódust CreateHostBuilder használni a ASP.NET Core-alkalmazás Main osztályában.

Args

Mindkettőt IDesignTimeDbContextFactory<TContext>.CreateDbContext , és Program.CreateHostBuilder fogadja el a parancssori argumentumokat.

Ezeket az argumentumokat az eszközökből adhatja meg:

dotnet ef database update -- --environment Production

A -- jogkivonat arra utasítja dotnet ef-et, hogy az utána következőket argumentumként kezelje, és ne próbálja meg opciókként elemezni őket. A dotnet ef által nem használt további argumentumokat a rendszer továbbítja az alkalmazásnak.