'[DBContext의 이름]' 형식의 개체를 만들 수 없습니다.설계 시 지원되는 다양한 패턴에 대하여
ASP에서 Mosh Hamedani 코스 중 하나를 수강하고 있습니다.Udemy의 NET MVC
코드 우선(Entity Framework)을 사용하여 데이터베이스를 설계하는 동안 오류가 발생했습니다.
처음에 "No DbContext were found in assembly"라는 오류가 발생하였습니다.이 문제를 해결한 후 다른 문제가 갑자기 급증했다.
다음 그림은 마이그레이션을 추가할 때 발견된 오류를 보여줍니다.이미 같은 오류를 찾아봤지만 허사였어요.지난 두 시간 동안 힘들었는데 지금까지 해결된 게 없어요.
'Vidly_Context' 형식의 개체를 만들 수 없습니다.설계 시 지원되는 다양한 패턴은 https://go.microsoft.com/fwlink/?linkid=851728을 참조하십시오.
(2) 매개 변수를 사용하여 자체 DbContext 생성자를 추가한 후에도 유사한 문제가 발생합니다.앱은 정상이지만 마이그레이션이 작동하지 않습니다.Dotnet 툴 @xspdf의 정보를 사용하여 EF(5로 작업할 때 이상한 이유로 3.1.5 사용)를 처음 업데이트하고 설정되지 않은 경우 메서드 + 하드코딩된 기본 연결 문자열로 지정된 생성자를 바꿉니다.
dotnet tool update --global dotnet-ef
// following command show the most during migration build/run in cmd
// mind current dir is Migrations folder of (VS) startup project here
dotnet ef --startup-project ../ --verbose migrations add test
3.1.5 및 컨텍스트 액티베이션 오류
The Entity Framework tools version '3.1.5' is older than that of the runtime '5.0.0'. Update the tools for the latest features and bug fixes.
Finding DbContext classes...
Finding IDesignTimeDbContextFactory implementations...
Finding application service provider in assembly '...'...
Finding Microsoft.Extensions.Hosting service provider...
No static method 'CreateHostBuilder(string[])' was found on class 'Program'.
No application service provider was found.
Finding DbContext classes in the project...
Found DbContext '...Context'.
Microsoft.EntityFrameworkCore.Design.OperationException: Unable to create an object of type '...Context'. For the different patterns supported at design time, see https://go.microsoft.com/fwlink/?linkid=851728
---> System.InvalidOperationException: Unable to resolve service for type 'System.String' while attempting to activate '...'. (my additional parameter)
at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.ConstructorMatcher.CreateInstance(IServiceProvider provider)
at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.CreateInstance(IServiceProvider provider, Type instanceType, Object[] parameters)
at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetServiceOrCreateInstance(IServiceProvider provider, Type type)
at Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.<>c__DisplayClass13_4.<FindContextTypes>b__13()
--- End of inner exception stack trace ---
at Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.<>c__DisplayClass13_4.<FindContextTypes>b__13()
at Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateContext(Func`1 factory)
at Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateContext(String contextType)
at Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.AddMigration(String name, String outputDir, String contextType, String namespace)
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.AddMigrationImpl(String name, String outputDir, String contextType, String namespace)
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.AddMigration.<>c__DisplayClass0_0.<.ctor>b__0()
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.<>c__DisplayClass3_0`1.<Execute>b__0()
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)
Unable to create an object of type '...Context'. For the different patterns supported at design time, see https://go.microsoft.com/fwlink/?linkid=851728
1- 웹 프로젝트를 스타트업 프로젝트로 설정합니다.
2- Package Manager Console에서 데이터 액세스 레이어(있는 경우)를 기본 프로젝트로 설정합니다.
3- 그런 다음 명령을 다시 실행합니다.
에러 메세지는, 설계시에 콘텍스트를 작성할 수 없었던 것을 나타내고 있습니다.마이그레이션 명령에서 --startup-project 플래그(또는 -s)를 사용하여 시작 프로젝트를 지정하면 실행 시 생성되는 것과 유사한 방법으로 설계 시 컨텍스트 인스턴스를 생성할 수 있습니다.
예를 들어 다음과 같습니다.
cd ./project_with_migrations_folder
dotnet ef --startup-project ../my_startup_project_path/ migrations add myMigration01
저도 같은 문제에 부딪혔어요.OP는 Startup.cs에 코드를 추가해야 한다고 언급했습니다.
https://go.microsoft.com/fwlink/?linkid=851728에는 다음 코드 샘플이 있습니다.
public class Startup
{
public void ConfigureServices(IServiceCollection services)
=> services.AddDbContext<ApplicationDbContext>();
}
ConfigureServices 메서드에서 다음 코드가 누락되었습니다.
services.AddDbContext<ApplicationDbContext>();
데이터베이스 컨텍스트에 대해 이 항목을 추가한 후 문제가 해결되었습니다.
에서 EF Core 코드 첫 번째 마이그레이션을 사용할 때 이 문제가 발생했습니다.MVC 프로젝트와 Blazor 프로젝트를 모두 포함하는 NET Core 3 솔루션.
Blazor를 사용하면 합니다.add-migration
스타트업 프로젝트를 MVC 프로젝트로 설정하고 있는 경우는 사용하지 않습니다.
에러 메시지에 링크되어 있는 문서 페이지를 읽고 startup.cs 파일의 코드를 비교한 결과, 이유는 알 수 없지만 스타트업 프로젝트를 MVC 프로젝트로 일시적으로 전환하면 수정이 됩니다.
앱 설정.json에 쉼표가 없어서 이 오류가 발생하였습니다.
{
"ConnectionStrings": {
"DefaultConnection": "Data Source=Leonardo-Notebook;Initial Catalog=MyDB;Integrated Security=True"
}, // <- Comma missing here
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
하여 별도의 클래스 에 DbContext를 한 후 이 하였습니다..NET Core 3.1
.
은 원래 과 같습니다.appsettings.json
:
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Design;
using Microsoft.Extensions.Configuration;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
namespace MyNamespace
{
public class ApplicationDbContextFactory : IDesignTimeDbContextFactory<ApplicationDbContext>
{
public ApplicationDbContext CreateDbContext(string[] args)
{
var configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.Build();
var optionsBuilder = new DbContextOptionsBuilder();
var connectionString = configuration
.GetConnectionString("DefaultConnection");
optionsBuilder.UseSqlServer(connectionString);
return new ApplicationDbContext(optionsBuilder.Options);
}
}
}
다른 프로젝트에서는 다음과 같이 사용할 수 있습니다.
var applicationDbContextFactory = new ApplicationDbContextFactory();
using (var dbContext = applicationDbContextFactory.CreateDbContext(args))
{
}
이는 프레임워크의 문제가 아니라 애플리케이션을 구축하는 방법입니다.예를 들어 DI를 사용하여 WebApi(또는 MVC 프로젝트)를 데이터 액세스 계층에서 분리한 경우 마이그레이션 추가 시 삽입하려는 연결 문자열을 컨텍스트에서 찾을 수 없기 때문에 이 문제가 발생합니다(실제로 이 경우).
여기 GitHub에서 좋은 설명을 찾을 수 있습니다.
이 레포의 이 범위에 해당하는 앱의 문제는 결코 아닙니다만, 어쨌든 몇 가지 안내를 하도록 하겠습니다.
이 오류가 발생하는 이유는 마이그레이션을 생성하려면 다음 중 하나가 필요하기 때문입니다.
기본 생성자(파라미터가 없는 생성자)가 있는 DbContext
Application Services에서 DbContext를 가져올 수 있음(즉, 종속성 주입)
올바르게 구성된 DbContext를 반환하는 디자인 타임팩토리
ApplicationDbContext 컨스트럭터에는 파라미터가 있으므로 옵션2 또는 3을 사용해야 합니다.상세한 것에 대하여는, 다음의 문서를 참조해 주세요.https://learn.microsoft.com/ef/core/miscellaneous/cli/dbcontext-creation
그러나 로깅을 개선하기 위해 프로그램 시작이 변경되었기 때문에 옵션 2(원래 사용하던 옵션)는 더 이상 작동하지 않습니다.
또한 Design Time Factory for ApplicationDbContext가 없기 때문에 현재 마이그레이션을 작성할 수 없습니다.
이 이행 작성 방법에 대해 알아보려면 다음 절차를 수행합니다.
CatalogContextDesignFactory > 또는 IntegrationEventLogContextDesignTimeFactory와 유사한 ApplicationDbContextDesignTimeFactory를 만들거나 Catalog 등의 다른 마이크로 서비스를 사용하여 시도합니다.이미 Design Time Factory가 있는 API입니다.
StartUp 파일의 ConfigureServices 메서드
services.AddDbContextPool<contextName>(
options => options.UseSqlServer(Configuration.GetConnectionString("conString")));
이건 ASP에서 가장 말도 안 되는 문제 중 하나예요.NET 코어말씀하신 코스에 대해서는 잘 모르겠습니다만, 프레젠테이션 레이어가 데이터 레이어에서 분리되어 있는 어플리케이션과 같은 어플리케이션이라면 최신 버전의 Microsoft 를 인스톨 해 주세요.EntityFrameworkCore프레젠테이션 레이어에 「스타트업 프로젝트」를 설계합니다.필수이며 오류 메시지에는 아무것도 표시되지 않습니다.
Azure SQL DB와 같이 적절하게 인증된 데이터베이스 서버를 사용하는 경우,Password={your_password}
접속 문자열에 서버 비밀번호를 입력합니다.
제 경우 appsettings.development.json 파일을 필수로 만들었지만 작성하지 않았습니다.환경 고유의 설정 파일을 작성하지 않는 경우는, 옵션의 true 로 설정합니다.
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{environment.EnvironmentName}.json", optional: true, reloadOnChange: true)
.AddEnvironmentVariables();
그러나 오류가 반드시 DbContext 및 해당 구성과 관련이 있는 것은 아닐 수 있습니다.애플리케이션 부팅 시 EF 툴링이 마이그레이션을 수행할 수 있도록 앱 부팅을 방해하는 다른 오류가 있을 수 있습니다.프로젝트 시작 시 기타 오류를 찾기 위한 메커니즘으로 시작 시 다양한 행에 콘솔 메시지를 추가할 수 있습니다.콘솔을 사용하여 마이그레이션하는 동안 연결 문자열과 같은 Appsetting 값을 검사할 수도 있습니다.
Console.WriteLine("I can see this because the app was able to proceed this far.");
스타트업 프로젝트에서 ASP를 사용하는 경우.NET Core Web Host 또는.NET Core Generic Host는 응용 프로그램의 서비스 공급자로부터 DbContext 개체를 가져오려고 시도합니다. 그렇지 않으면 디자인 타임 팩토리(https://learn.microsoft.com/es-es/ef/core/miscellaneous/cli/dbcontext-creation))에서 DbContext를 생성할 수 있습니다.
언급URL : https://stackoverflow.com/questions/55123853/unable-to-create-an-object-of-type-dbcontexts-name-for-the-different-patte
'programing' 카테고리의 다른 글
ORA-00060: 리소스를 기다리는 동안 교착 상태가 감지됨 (0) | 2023.06.21 |
---|---|
PowerShell의 여러 줄 댓글 (0) | 2023.04.22 |
스위프트: 가드렛 vs if let (0) | 2023.04.22 |
'npm'은 내부 또는 외부 명령, 작동 가능한 프로그램 또는 배치 파일로 인식되지 않습니다. (0) | 2023.04.22 |
열을 null로 변경 (0) | 2023.04.22 |