ASP.NET Core 2.0으로 업그레이드 한 후 마이그레이션을 만들 수 없습니다.


109

ASP.NET Core 2.0으로 업그레이드 한 후 더 이상 마이그레이션을 만들 수없는 것 같습니다.

나는 얻고있다

" 'Program'클래스에서 'BuildWebHost'메서드를 호출하는 동안 오류가 발생했습니다. 응용 프로그램 서비스 공급자없이 계속합니다. 오류 : 하나 이상의 오류가 발생했습니다. (로그인에서 요청한"... "데이터베이스를 열 수 없습니다. 로그인에 실패했습니다. 로그인 사용자 '...'에 대해 실패했습니다. "

" 'MyContext'유형의 개체를 만들 수 없습니다. 'IDesignTimeDbContextFactory'구현을 프로젝트 에 추가 하거나 디자인 타임에 지원되는 추가 패턴에 대해서는 https://go.microsoft.com/fwlink/?linkid=851728 을 참조 하십시오 ."

이전에 실행 한 명령은 $ dotnet ef migrations add InitialCreate --startup-project "..\Web"(DBContext가있는 프로젝트 / 폴더에서)입니다.

연결 문자열 : "Server=(localdb)\\mssqllocaldb;Database=database;Trusted_Connection=True;MultipleActiveResultSets=true"

이것은 내 Program.cs입니다.

 public class Program
{
    public static void Main(string[] args)
    {
        BuildWebHost(args).Run();
    }

    public static IWebHost BuildWebHost(string[] args) =>
       WebHost.CreateDefaultBuilder(args)
           .UseStartup<Startup>()
           .Build();
}

3
아마도 문제는 Program.cs에 없습니다. 아마도 Configure 메서드의 끝에 시드 데이터를로드하는 명령어를 사용하는 것입니다. DbInitializer.Initialize (context); 해당 지침이있는 경우 주석 : //DbInitializer.Initialize(context); 그런 다음 마이그레이션 지침을 실행하여 테스트합니다. 문제가 발생하면 DbInitializer.cs 클래스에 대한 후속 조치를 취하십시오.
Miguel Torres C

1
MyContext 클래스가 다른 클래스 라이브러리 프로젝트에 있습니까?
ORHUN

여기에서 같은 문제, 컨텍스트는 다른 라이브러리에 있습니다. id가 컨텍스트에 매개 변수가 적은 구성자를 추가하면 마이그레이션이 작동하지만 동일한 오류가 발생합니다. ( 'Program'클래스에서 'BuildWebHost'메서드를 호출하는 동안 오류가 발생했습니다. 애플리케이션 서비스 공급자없이 계속합니다. 오류 : 개체 참조가 설정되지 않았습니다. 개체의 인스턴스).
iBoonZ

결국 해결 되었습니까?
Konrad Viltersten 2017 년

@MiguelTorresC 그 의견에 감사드립니다. 나는 나의 Seeding Methods and Migrations가 다시 작동하기 시작했다고 언급했습니다. 정말 감사합니다 !!!
Amit Philips

답변:


123

웹 프로젝트 내부에 IDesignTimeDbContextFactory를 구현하는 클래스를 추가 할 수 있습니다.

다음은 샘플 코드입니다.

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

그런 다음 데이터베이스 프로젝트로 이동하여 명령 줄에서 다음을 실행합니다.

dotnet ef migrations add InitialMigration -s ../Web/

dotnet ef database update -s ../Web/

-s stands for startup project and ../Web/ is the location of my web/startup project.

자원


2
나는 얻는다 : 구성 파일 'appsettings.json'을 찾을 수 없으며 선택 사항이 아닙니다. 실제 경로는 'C : \ Users \ XXX \ Documents \ Visual Studio 2017 \ Projects \ XXX \ src \ XXX.Api \ bin \ Debug \ netcoreapp2.0 \ appsettings.json'입니다. 내 appsettings는 C : \ Users \ XXX \ Documents \ Visual Studio 2017 \ Projects \ XXX \ src \ XXX.Api에 있습니다.
Reft

당신이 그것으로 문제를 해결해야 지역 복사 할 appsettings.json 파일이 설정되어 있는지 확인 찾을 수 없다는
DaImTo

1
이 솔루션은 Entity Framework에 대한 종속성을 호스트 응용 프로그램 (제 경우에는 웹 프로젝트)에 도입합니다. 이 문제를 해결할 방법이 있습니까? 내 리포지토리 라이브러리가 EF 항목을 보유하고 웹 앱에 EF를 도입하지 않기를 바랍니다.
Banoona

이것이 허용 대답은에도 불구하고,이 하나 더 : stackoverflow.com/a/52671330/1737395 실제로, --verbose 플래그를 사용하여 마이그레이션을 실행하는 데 도움이 크게
barbara.post

73

에 대한 필요가 없습니다 IDesignTimeDbContextFactory.

운영

add-migration initial -verbose

아래 세부 사항 을 공개 합니다

'프로그램'클래스에서 IWebHost에 액세스하는 동안 오류가 발생했습니다. 애플리케이션 서비스 제공 업체없이 계속합니다.

경고 는 문제 의 근본 원인입니다.

내 경우에는 , 문제는 가지고 있었다 ApplicationRole : IdentityRole<int>및 호출 services.AddIdentity<ApplicationUser, IdentityRole>()오류가 아래의 원인이 된

System.ArgumentException: GenericArguments[1], 'Microsoft.AspNetCore.Identity.IdentityRole', 
on 'Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore`9[TUser,TRole,TContext,
TKey,TUserClaim,TUserRole,TUserLogin,TUserToken,TRoleClaim]' violates the constraint of type 'TRole'.
---> System.TypeLoadException: GenericArguments[1], 'Microsoft.AspNetCore.Identity.IdentityRole', 
on 'Microsoft.AspNetCore.Identity.UserStoreBase`8[TUser,TRole,TKey,TUserClaim,
TUserRole,TUserLogin,TUserToken,TRoleClaim]' violates the constraint of type parameter 'TRole'.

3
예-Verbose는 실제 문제를 실제로 발견하는 데 도움이됩니다. 제 경우에는 시작에 AddDbContext 서비스를 추가하지 않았습니다.
sudhakarssd

3
DOTNET EF 마이그레이션 추가 InitialCreate --verbose
barbara.post

4
@tchelidze 제 경우에는 ApplicationDbContext에 매개 변수없는 생성자가 없었습니다.
Tiago Ávila

1
이것은 환상적인 팁이며, 받아 들여지는 대답이어야합니다
Avrohom Yisroel 19

1
정말 감사합니다. 이것은 제가 제 문제를 찾고 해결하는 데 도움이되었습니다. 제 경우에는 " 'Data.Access.DAL.MainDbContext'유형에 대해 정의 된 매개 변수없는 생성자가 없습니다."였으므로 생성자에서 매개 변수를 제거하고 마법처럼 작동했습니다!
Sarah

25

솔루션 1 : (99 % 사례에서 문제 찾기)

웹 응용 프로그램 프로젝트를 시작 프로젝트로 설정

-verbose옵션으로 다음 명령을 실행하십시오 .

Add-Migration Init -Verbose

-verbose 옵션은 실제 문제를 실제로 발견하는 데 도움이되며 자세한 오류가 포함되어 있습니다.

해결책 2 :

앱을 실행하지 않고 호스트를 구성 하는 메서드 를 찾을 것으로 예상 되므로 이름 BuildWebHost()을 .CreateWebHostBuilder()Entity Framework Core toolsCreateHostBuilder

.NET Core 2.2

public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>();
} 

.NET Core 3.1

이름 바꾸기 BuildWebHost()CreateHostBuilder()

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

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

해결책 3 :

Dbcontext종속성 주입에 추가했는지 확인하십시오 : AddDbContext<TContext>DbContext 유형 TContext및 해당 DbContextOptions<TContext>서비스 컨테이너에서 주입에 사용할 수 있도록합니다. 이를 DbContext허용 하는 생성자 인수를 유형에 추가해야합니다 DbContextOptions<TContext>.

예 : Startup.cs에서

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<AppDbContext>(options => options.UseSqlServer(connectionString));
}

AppDbContext 코드 :

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

}

1
이것은 나를 위해 일했습니다. 에서 Program.cs에서 BuildWebHost 기능을 변경 public static IWebHostBuilder BuildWebHost(string[] args)하는 public static IWebHost BuildWebHost(string[] args)으로 .Build()이제 기능에 포함
zola25

1
여러분, ASP.NET Core 2.1 이상을 사용하는 경우 BuildWebHost 메서드는 docs.microsoft.com/en-us/aspnet/core/migration/… 때문에 CreateWebHostBuilder라는 다른 이름을 갖게 되므로 CreateWebHostBuilder의 이름을 BuildWebHost로 바꾸면 마이그레이션이 찾을 수 있습니다. BuildWebHost에서 DbContext를 가져옵니다.
KEMBL

2
감사 메이트는 사용하지 않고 지출 후 구성 2 시간을 해결IDesignTimeDbContextFactory
Azri 리아에게

3
"-Verbose"플래그에 감사드립니다. 예외의 근본 원인을 찾는 데 도움이되었습니다.
Sergey_T

21
public class Program
{
    public static void Main(string[] args)
    {
        BuildWebHost(args).Run();
    }

    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .Build();
    }
}

마이그레이션은 기본적으로이 방법을 사용하므로로 이름 BuildWebHost()을 바꾸십시오 CreateWebHostBuilder().


4
뭐. 이이 문제를 모든 페이지의 거래에 광고해야 당신이 심각하다 . 즉각적인 성공. 감사합니다.
Chaim Eliyah

내 하루를 저장하십시오 !!! 매우 이상한 오류입니다. 난`미리보기 (7)과 .NET의 핵심 3.0을 사용하여이 오류가 존재 STIL
D 토도로프을

@DTodorov은이 읽기 devblogs.microsoft.com/dotnet/...
sherox

D 토도로프 단지는 CreateHostBuilder ()에 BuildWebHost를 ()의 이름을 변경
알리 Bayat

1
@WernerCD Cuz Worker는 Net Core 3의 IHostBuilder를 구현하는 CreateHostBuilder () 메서드를 사용합니다
sherox

11

제 경우 문제의 원인은 여러 개의 시작 프로젝트였습니다. 내 솔루션에는 Mvc, Api 및 Dal의 세 가지 프로젝트가 있습니다. Dal 프로젝트의 DbContext 및 마이그레이션.

여러 시작 프로젝트를 구성했습니다. 시작을 클릭했을 때 Mvc와 Api 프로젝트가 모두 실행 중이었습니다. 그러나이 경우에는이 오류가 발생했습니다.

" 'MyContext'유형의 개체를 만들 수 없습니다. 'IDesignTimeDbContextFactory'구현을 프로젝트 에 추가 하거나 디자인 타임에 지원되는 추가 패턴에 대해서는 https://go.microsoft.com/fwlink/?linkid=851728 을 참조 하십시오 ."

Mvc를 유일한 시작 프로젝트로 설정하고 패키지 관리자 콘솔에서 Dal을 선택한 후 마이그레이션을 성공적으로 추가 할 수 있습니다.


1
고맙습니다, 저에게도 같은 일이 일어났습니다. 시작 프로젝트를 시작 / 프로그램 클래스가있는 곳으로 변경해야했습니다. 오류 메시지는 나쁜 농담입니다.
Ľuboš Čurgó

1
출력 메시지는 정말 답답했습니다. 예기치 않게 시작 프로젝트를 선택하지 않았습니다. 이것이 dbContext를 생성 할 수없는 이유입니다. 감사.
upkit

1
감사합니다 당신에게 선생님은 ... 내 시간의 많은 저장됩니다
Naveed 칸

7

AppContext 클래스 외에 AppContext.cs에서 다른 클래스를 추가하십시오.

// required when local database deleted
public class ToDoContextFactory : IDesignTimeDbContextFactory<AppContext>
{
    public AppContext CreateDbContext(string[] args)
    {
        var builder = new DbContextOptionsBuilder<AppContext>();
          builder.UseSqlServer("Server=localhost;Database=DbName;Trusted_Connection=True;MultipleActiveResultSets=true");
        return new AppContext(builder.Options);
    }
}

이것은 두 번째 문제를 해결할 것입니다.

" 'MyContext'유형의 개체를 만들 수 없습니다. 'IDesignTimeDbContextFactory'구현을 프로젝트에 추가하십시오.

그 후에 마이그레이션 Initial추가 하고 update-database 명령 을 실행하여 실행할 수 있습니다. 그러나 로컬 SqlServer에 아직 데이터베이스가 없을 때 이러한 명령을 실행하면 첫 번째 오류와 같은 경고가 표시됩니다. "오류

'Program'클래스에서 'BuildWebHost'메서드를 호출하는 동안 발생했습니다 ... 로그인에 실패했습니다. 사용자 '...'에 대한 로그인 실패 "

그러나 마이그레이션이 생성되고 실행될 수 있기 때문에 오류가 아닙니다. 따라서 처음으로이 오류를 무시하고 Db가 존재하므로 후자는 다시 발생하지 않습니다.


4

참조가 있는지 확인하십시오

<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="2.0.0" />

5
<PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.0" />그 참조를 포함 하여 사용 하고 있습니다. 위의 내용도 포함 해 보았지만 변경 사항은 없습니다.
ruhm

4

이 게시물 에서 영감 얻은 이 토론 에서이 솔루션을 시도 할 수 있습니다 .

public static IWebHost MigrateDatabase(this IWebHost webHost)
{
    using (var scope = webHost.Services.CreateScope())
    {
        var services = scope.ServiceProvider;

        try
        {
            var db = services.GetRequiredService<MyContext>();
            db.Database.Migrate();
        }
        catch (Exception ex)
        {
            var logger = services.GetRequiredService<ILogger<Program>>();
            logger.LogError(ex, "An error occurred while migrating the database.");
        }
    }

    return webHost;
}
public static void Main(string[] args)
{
    BuildWebHost(args)
        .MigrateDatabase()
        .Run();
}

2
나는 여전히 얻는다 : 'IDesignTimeDbContextFactory <DatabaseContext>'의 구현 추가 ......
Reft

4

저에게 정말로 도움이 된 것은이 기사였습니다 : https://elanderson.net/2017/09/unable-to-create-an-object-of-type-applicationdbcontext-add-an-implementation-of-idesigntimedbcontextfactory/

기본 아이디어는 .net 코어 1에서 2로 전환 할 때 모든 db 초기화가 StartUp.cs에서 Program.cs로 이동되어야한다는 것입니다. 그렇지 않으면 EF 작업은 작업을 수행 할 때 DB 초기화를 시도하고 실행합니다.

"공식 마이그레이션 문서 ( https://docs.microsoft.com/en-us/ef/core/miscellaneous/1x-2x-upgrade )에"데이터베이스 초기화 코드 이동 "이라는 멋진 섹션 이 있습니다. 그리워했습니다. 그래서 제가 한 것처럼 토끼 구멍을 뚫기 전에 이것이 IdesignTimeDbContextFactory 구현을 추가해야하는 원인이 아닌지 확인하십시오. "


감사합니다. 이것은 저도 도왔습니다.
Sergey

3

에서

https://docs.microsoft.com/en-us/ef/core/miscellaneous/cli/dbcontext-creation

새 ASP.NET Core 2.0 애플리케이션을 만들 때이 후크가 기본적으로 포함됩니다. 이전 버전의 EF Core 및 ASP.NET Core에서 도구는 애플리케이션의 서비스 공급자를 얻기 위해 Startup.ConfigureServices를 직접 호출하려고 시도했지만이 패턴은 더 이상 ASP.NET Core 2.0 애플리케이션에서 올바르게 작동하지 않습니다. ASP.NET Core 1.x 애플리케이션을 2.0으로 업그레이드하는 경우 새 패턴을 따르도록 Program 클래스를 수정할 수 있습니다.

.Net Core 2.x에 공장 추가

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);
        }
    }

3

이 문제가 있었고 Set-> Web Application (Included Program.cs) Project에서-> "Set as Startup Project"로이 문제가 해결되었습니다.

그런 다음-> add-migration initial -verbose를 실행하십시오.

패키지 관리자 콘솔에서

시작 프로젝트로 설정


고맙습니다. 저에게 효과가 있었던 유일한 해결책은 웹 프로젝트를 시작 프로젝트로 설정하는 것이었고 정확히 수행해야 할 작업이었습니다.
user3012760

3

이러한 IDesignTimeDbContextFactory를 피하려면 시작시 Seed 메서드를 사용하지 않는지 확인하십시오. 내 시작에서 정적 시드 방법을 사용하고 있었는데 이로 인해이 오류가 발생했습니다.


2

이전에는 Startup.cs의 Configure 메서드에서 시드 데이터를 구성했습니다. 이제 요청 파이프 라인을 설정하는 데만 Configure 메서드를 사용하는 것이 좋습니다. 응용 프로그램 시작 코드는 Main 메서드에 속합니다.

리팩토링 된 Main 메서드. Program.cs에 다음 참조를 추가합니다.

Microsoft.Extensions.DependencyInjection 사용;

MyProject.MyDbContextFolder 사용;

public static void Main(string[] args)
{
    var host = BuildWebHost(args);

    using (var scope = host.Services.CreateScope())
    {
        var services = scope.ServiceProvider;
        try
        {
            var context = services.GetRequiredService<MyDbConext>();
            DbInitializer.Initialize(context);
        }
        catch (Exception ex)
        {
            var logger = services.GetRequiredService<ILogger<Program>>();
            logger.LogError(ex, "An error occurred while seeding the database.");
        }
    }

    host.Run();
}



2

제 경우에는 Startup.cs 파일 에서 SeedData.EnsurePopulated () 라는 메서드 가 호출 되었기 때문에 문제가 발생했습니다 .

public class Startup
{
    public Startup(IConfiguration configuration) => Configuration = configuration;
    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        //
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseDeveloperExceptionPage();
        app.UseStatusCodePages();
        app.UseStaticFiles();
        app.UseSession();
        app.UseMvc(routes =>
        {
            //
        });

        SeedData.EnsurePopulated(app);
    }
}

SeedData 클래스 의 작업은 데이터베이스 테이블에 초기 데이터를 추가하는 것입니다. 코드는 다음과 같습니다.

public static void EnsurePopulated(IApplicationBuilder app)
    {
        ApplicationDbContext context = app.ApplicationServices.GetRequiredService<ApplicationDbContext>();
        context.Database.Migrate();
        if (!context.Products.Any())
        {
            context.Products.AddRange(
            new Product
            {
                Name = "Kayak",
                Description = "A boat for one person",
                Category = "Watersports",
                Price = 275
            },
            ....
            );
            context.SaveChanges();
        }
    }

해결책

마이그레이션을 수행하기 전에 Startup.cs 파일에서 SeedData 클래스 호출을 주석으로 처리 하십시오.

// SeedData.EnsurePopulated(app);

그것은 내 문제를 해결했고 당신의 문제도 같은 방식으로 해결되기를 바랍니다.


1

나는 같은 문제에 부딪쳤다. 솔루션에 두 개의 프로젝트가 있습니다. 어느

  1. API
  2. 컨텍스트 모델을 보유하는 서비스 및 저장소

처음에는 API 프로젝트가 시작 프로젝트로 설정되었습니다.

Startup 프로젝트를 컨텍스트 클래스를 보유하는 프로젝트로 변경했습니다 . Visual Studio 를 사용하는 경우 다음을 수행하여 프로젝트를 시작 프로젝트로 설정할 수 있습니다.

솔루션 탐색기 열기 >> 컨텍스트 프로젝트를 마우스 오른쪽 버튼으로 클릭 >> 시작 프로젝트로 설정 선택


1

우선 데이터베이스를 구성했는지 확인하십시오 Startup.cs . 제 경우에는 아래를 지정하지 않았 으므로이 오류가 발생했습니다.Startup.cs

    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection"), x => x.MigrationsAssembly("<Your Project Assembly name where DBContext class resides>")));

1

ASP.NET Core 3.1 및 EntityFrameWorkCore 3.1.0 사용. 매개 변수없는 생성자로만 컨텍스트 클래스의 OnConfiguring 재정의

```protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        if (!optionsBuilder.IsConfigured)
        {
            IConfigurationRoot configuration = new ConfigurationBuilder()
               .SetBasePath(Directory.GetCurrentDirectory())
               .AddJsonFile("appsettings.json")
               .Build();
            var connectionString = configuration.GetConnectionString("LibraryConnection");
            optionsBuilder.UseSqlServer(connectionString);
        }
    }
```

1

나는 오류에 직면했다

" 'MyContext'유형의 개체를 만들 수 없습니다. 'IDesignTimeDbContextFactory'구현을 프로젝트 에 추가 하거나 디자인 타임에 지원되는 추가 패턴에 대해서는 https://go.microsoft.com/fwlink/?linkid=851728 을 참조 하십시오 ."

이것이 내 문제가 해결 된 방법입니다. 솔루션 디렉토리에있는 동안 아래 명령을 실행하십시오.

 dotnet ef migrations add InitialMigration --project "Blog.Infrastructure" --startup-project "Blog.Appication"

여기 Application은 Startup.cs 클래스가 포함 된 시작 프로젝트이고 Infrastructure는 DbContext 클래스가 포함 된 프로젝트입니다.

그런 다음 동일한 구조를 사용하여 업데이트를 실행하십시오.

dotnet ef database update --project "Blog.Infrastructure" --startup-project "Blog.Application"

0

이전 Microsoft.EntityFrameworkCore.Tools.DotNet을 참조했기 때문에 동일한 문제가 발생했습니다.

<DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="1.0.0" />

최신 버전으로 업그레이드 한 후 문제가 해결되었습니다.


0

메인 프로젝트의 appsettings.json 파일에서 'Copy to Output directory'를 "Copy always"로 설정했고 제대로 작동했습니다.


0

.net 핵심 콘솔 애플리케이션 용 샘플 DB 컨텍스트 클래스

using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Design;
using Microsoft.Extensions.Configuration;
using System.IO;

namespace EmailServerConsole.Data
{
    public class EmailDBContext : DbContext
    {
        public EmailDBContext(DbContextOptions<EmailDBContext> options) : base(options) { }
        public DbSet<EmailQueue> EmailsQueue { get; set; }
    }

    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);
        }
    }
}

이것은 저자의 질문에 답할 수 있지만 설명하는 단어와 문서 링크가 부족합니다. 원시 코드 조각은 주변에 일부 문구가 없으면 그다지 도움이되지 않습니다. 좋은 답변을 작성하는 방법이 매우 도움 이 될 수도 있습니다. 답변을 수정하십시오.
hellow

0

시작 클래스 생성자에서을 사용하여 구성에 json 파일 (연결 문자열이있는 위치)을 추가 할 수도 있습니다. 예:

    IConfigurationRoot _config;
    public Startup(IHostingEnvironment env)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json");

        _config = builder.Build();
    }

0

I가 변경 되었기 때문에 나에게는이었다 Output Type에서 내 시작 프로젝트의를 Console ApplicationClass Library.

로 되돌려 Console Application트릭을 수행했습니다.


0

다음과 같은 솔루션에서이 문제가 발생했습니다.

  • .NET Core 2.2 MVC 프로젝트
  • .NET Core 3.0 Blazor 프로젝트
  • .NET Standard 2.0 클래스 라이브러리 프로젝트의 DB 컨텍스트

Blazor 프로젝트를 시작 프로젝트로 설정하면 "개체를 만들 수 없습니다 ..."라는 메시지가 표시되지만 MVC 프로젝트가 시작 프로젝트로 설정된 경우에는 표시되지 않습니다.

패키지 관리자 콘솔 (마이그레이션을 생성하는 곳)에서 기본 프로젝트가 실제로 DB 컨텍스트를 포함하는 C # 클래스 라이브러리로 설정되어 있고 DB 컨텍스트도 add-migration에 대한 호출 add-migration MigrationName -context ContextName이므로 Visual Studio가 현재 설정된 시작 프로젝트에 관심이 있다는 것이 이상하게 보입니다.

그 이유는 Blazor 프로젝트가 시작 프로젝트 일 때 PMC가 시작 프로젝트에서 .NET 버전을 Core 3.0으로 결정한 다음이를 사용하여 .NET Standard 2.0 클래스에서 마이그레이션을 실행하려고하기 때문이라고 생각합니다. 도서관과 일종의 충돌을 일으키고 있습니다.

원인이 무엇이든 시작 프로젝트를 Blazor 프로젝트가 아닌 Core 2.2를 대상으로하는 MVC 프로젝트로 변경하면 문제가 해결되었습니다.


0

나에게 문제는 잘못된 프로젝트 내에서 마이그레이션 명령을 실행하고 있다는 것입니다. DbContext가 포함 된 프로젝트가 아닌 Startup.cs가 포함 된 프로젝트 내에서 명령을 실행하면이 특정 문제를 지나칠 수있었습니다.


0

제 경우에는 시작 프로젝트를 init로 설정하면 도움이됩니다. 다음을 실행하여이를 수행 할 수 있습니다.

dotnet ef migrations add init -s ../StartUpProjectName

-4

나는 같은 문제가 있었다. ap.jason을 application.jason로 변경하고 문제를 해결했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.