روش ارتقاء به EF Core 2.0
حداقل وابستگیهای مورد نیاز جهت کار با EF Core 2.0 و همچنین اجرای مهاجرتهای آن به صورت ذیل است:
سپس تغییر مهم دیگر، ندید گرفتن پارامتر startup-project به طور کامل است (نکتهای که در مطلب فوق در مورد آن بحث شدهاست). اگر Context برنامهی شما دارای پارامتر است، EF Core 2.0 «در حین اجرای مهاجرتها» به صورت صریح نیاز دارد بداند که چطور باید این Context را وهله سازی کرد و دیگر مانند قبل سعی نمیکند وابستگیهای تزریق شدهی در آنرا حدس بزند:
به همین جهت در اینجا باید اینترفیس جدید IDesignTimeDbContextFactory را پیاده سازی کرده و سپس مشخص کنید چگونه میتوان یک ApplicationDbContext را وهله سازی کرد:
این کلاس ویژه باید در اسمبلی قرار گیرد که Context برنامه در آن تعریف شدهاست و یافتن آن توسط EF Core 2.0 خودکار است.
یک نمونه پیاده سازی کامل آن را که در پروژهی DNTIdentity بکار رفتهاست، در اینجا میتوانید مشاهده کنید.
مثالی دیگر برای حالتیکه سازندهی کلاس Context یک <DbContextOptions<T را دریافت میکند:
حداقل وابستگیهای مورد نیاز جهت کار با EF Core 2.0 و همچنین اجرای مهاجرتهای آن به صورت ذیل است:
<ItemGroup> <PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.0.0" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="2.0.0" PrivateAssets="All" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.0.0" PrivateAssets="All" /> <PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="2.0.0" /> <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="2.0.0" /> </ItemGroup> <ItemGroup> <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0" /> </ItemGroup>
سپس تغییر مهم دیگر، ندید گرفتن پارامتر startup-project به طور کامل است (نکتهای که در مطلب فوق در مورد آن بحث شدهاست). اگر Context برنامهی شما دارای پارامتر است، EF Core 2.0 «در حین اجرای مهاجرتها» به صورت صریح نیاز دارد بداند که چطور باید این Context را وهله سازی کرد و دیگر مانند قبل سعی نمیکند وابستگیهای تزریق شدهی در آنرا حدس بزند:
Unable to create an object of type 'ApplicationDbContext'. Add an implementation of 'IDesignTimeDbContextFactory<ApplicationDbContext>' to the project, or see https://go.microsoft.com/fwlink/?linkid=851728 for additional patterns supported at design time.
public class ApplicationDbContextFactory : IDesignTimeDbContextFactory<ApplicationDbContext> { public ApplicationDbContext CreateDbContext(string[] args) { return new ApplicationDbContext(siteSettings, httpContextAccessor, hostingEnvironment, logger); } }
یک نمونه پیاده سازی کامل آن را که در پروژهی DNTIdentity بکار رفتهاست، در اینجا میتوانید مشاهده کنید.
مثالی دیگر برای حالتیکه سازندهی کلاس Context یک <DbContextOptions<T را دریافت میکند:
public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory<MyDbContext> { public MyDbContext CreateDbContext(string[] args) { IConfigurationRoot configuration = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json") .Build(); var builder = new DbContextOptionsBuilder<MyDbContext>(); var connectionString = configuration.GetConnectionString("DefaultConnection"); builder.UseSqlServer(connectionString); return new MyDbContext(builder.Options); } }