Unable to create an object of type 'MyProjectContext'. For the different patterns supported at design time

4/15/2020 MVC
1874

برای پروژه ای خودم با توجه به پروژه،  چند sln میسازم برای یکی پروژه وب و برای Model هم یک classlibrary جدا گانه و چند class library دیگر هم معمولا با توجه به پروژه اضاف میکنم 

migration  را برای ایجاد بانک اطلاعات ی در پروژه Model  میسازم و همانجا هم دستورآپدیت بانک اطلاعاتی 

در VSCode

dotnet ef migrations add yourMigrationName
dotnet ef database update

,و در Visual Studio 

add-migration MigrationName -context ContextName
update-database

 

در ویژال استادیو زمانی از دو پروژه استفاده میکنید که یکی برای Model  و یک برای پروژه وب در نظر میگرید و دستور اضافه کردن Migration را صادر میکنید لازم است تا

در منوی بالا گه پروژه استارت را تعریف میکنیم پروژه وب را تعریف منید و در قسمت package manger console  هم پروژه مودال

در غیر اینصورت با خطای design time برخورد خواهید کرد، البته راه حل دیگری هم دارد که در ادامه بعد از بررسی vscode  به آن میپردازیم 

در VS code  شما امکان استفاده بصری منند انچه در Visual studio  وجود دارد نیستید 

راه حل مشترکی که در یک خط بالا تر هم به ان اشاره کردم و در سابت microsoft  هم به آن اشاره شده ساخت کلاسی است که از IDesignTimeDbContextFactory  ارث بری داشته باشد

 

 public class ApplicationContextDbFactory : IDesignTimeDbContextFactory<EmailDBContext>
    {
        EmailDBContext IDesignTimeDbContextFactory<EmailDBContext>.CreateDbContext(string[] args)
        {
            IConfigurationRoot configuration = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json")
                .Build();
            var builder = new DbContextOptionsBuilder<EmailDBContext>();
            var connectionString = configuration.GetConnectionString("connection_string");
            builder.UseSqlServer(connectionString);
            return new EmailDBContext(builder.Options);
        }
    }

اما به نظر من زمانی که میشود در ویژال استادیو یا اتخاب دو گزینه به راحتی migration  رو اضافه کرد چرا باید همچین کلاسی در پروژه Model ساخت !!

راه حل ساده آن این بود که در خط فرمان این کد رو بنویسیم 

 

dotnet ef migrations add MmigrationName --context MyProjectcontext -s ../myProject.Web

 

که در آن نام پروژه و نام Context  و نام پرژه ایکه پروژه وب شماست به اختیار شما تغییر خواهد داشت

یعنی دستور آپدیت هم به این صورت خواهد بود 

dotnet ef database update --context myprojectcontext -s ../myproject.web