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

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



답변

웹 프로젝트 내부에 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.

자원


답변

에 대한 필요가 없습니다 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'.


답변

솔루션 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)
    { }

}


답변

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().


답변

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

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

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

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


답변

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가 존재하므로 후자는 다시 발생하지 않습니다.


답변

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

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