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 tools
CreateHostBuilder
.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" />