클래스 라이브러리 프로젝트에서 DBContext를 올바르게 정의하는 방법은 무엇입니까?

asp.net-web-api c# entity-framework entity-framework-core

문제

엔티티 프레임 워크 7을 사용하고 두 개의 프로젝트를 만들었습니다. 한 프로젝트는 ASP.NET 5 웹 API 프로젝트로, 다른 하나는 클래스 라이브러리 프로젝트 (패키지)로 모든 데이터 액세스 레이어 논리를 저장하려고합니다.이 방법으로이 패키지를 도로 아래의 다른보고 프로젝트에 사용할 수 있습니다. 내가 할 수있는 다른 추가 서비스.

기본적으로 내 데이터 라이브러리 프로젝트에서 함수를 호출하는 웹 API 프로젝트의 컨트롤러에 간단한 게시물이 있습니다. 함수가 데이터베이스를 시작하면 두 프로젝트 모두에 정의 된 데이터베이스조차 정의되지 않았습니다.


오류

{"No database providers are configured. Configure a database provider by overriding OnConfiguring in your DbContext class or in the AddDbContext method when setting up services."}

암호

데이터 라이브러리 프로젝트 : InsertPerson

{"No database providers are configured. Configure a database provider by overriding OnConfiguring in your DbContext class or in the AddDbContext method when setting up services."}

구성 파일

웹 API 프로젝트 : Startup.cs

{"No database providers are configured. Configure a database provider by overriding OnConfiguring in your DbContext class or in the AddDbContext method when setting up services."}

웹 API 프로젝트 : appsettings.json

{"No database providers are configured. Configure a database provider by overriding OnConfiguring in your DbContext class or in the AddDbContext method when setting up services."}

웹 API 프로젝트 : project.json

{"No database providers are configured. Configure a database provider by overriding OnConfiguring in your DbContext class or in the AddDbContext method when setting up services."}

데이터 라이브러리 프로젝트 : Startup.cs

{"No database providers are configured. Configure a database provider by overriding OnConfiguring in your DbContext class or in the AddDbContext method when setting up services."}

데이터 라이브러리 프로젝트 : appsettings.json

{"No database providers are configured. Configure a database provider by overriding OnConfiguring in your DbContext class or in the AddDbContext method when setting up services."}

데이터 라이브러리 프로젝트 : AppContext.cs

{"No database providers are configured. Configure a database provider by overriding OnConfiguring in your DbContext class or in the AddDbContext method when setting up services."}

수락 된 답변

샘플 코드의 문제는 ServiceProvider에서 AppContext 인스턴스를 푸는 대신 AppContext 인스턴스를 새로 작성한다는 것입니다. 이 방법으로 DbContext를 초기화하면 새 ServiceProvider가 컨텍스트에 대해 암시 적으로 만들어지고 Startup.cs의 컨피규레이션 중 어느 컨텍스트도 존중되지 않습니다. 이것은 OnConfiguring에서 컨텍스트를 구성하고 나머지 응용 프로그램에서 종속성 주입에 관심이없는 경우에 사용하려는 패턴입니다.

이런 종류의 상황에서 나는 constructor injection을 통해 AppContext를 얻을 것을 기대한다. 이런 종류의 솔루션의 경우 데이터 액세스 계층 클래스를 ServiceCollection에 등록해야합니다. 결과는 다음과 같이 보입니다.

데이터 라이브러리 프로젝트 : AppContext.cs

namespace DataLibrary
{
    public class AppContext : IdentityDbContext<ApplicationUser>
    {
        public DbSet<tbl_Person> tbl_Person { get; set; }

        protected override void OnModelCreating(ModelBuilder builder)
        {
            new tbl_PersonMap(builder.Entity<tbl_Person>());
            base.OnModelCreating(builder);
        }
    }
}

데이터 라이브러리 프로젝트 : PersonHelper.cs

namespace DataLibrary
{
    public class AppContext : IdentityDbContext<ApplicationUser>
    {
        public DbSet<tbl_Person> tbl_Person { get; set; }

        protected override void OnModelCreating(ModelBuilder builder)
        {
            new tbl_PersonMap(builder.Entity<tbl_Person>());
            base.OnModelCreating(builder);
        }
    }
}

웹 API 프로젝트 : Startup.cs

namespace DataLibrary
{
    public class AppContext : IdentityDbContext<ApplicationUser>
    {
        public DbSet<tbl_Person> tbl_Person { get; set; }

        protected override void OnModelCreating(ModelBuilder builder)
        {
            new tbl_PersonMap(builder.Entity<tbl_Person>());
            base.OnModelCreating(builder);
        }
    }
}

웹 API 프로젝트 : MyController.cs

namespace DataLibrary
{
    public class AppContext : IdentityDbContext<ApplicationUser>
    {
        public DbSet<tbl_Person> tbl_Person { get; set; }

        protected override void OnModelCreating(ModelBuilder builder)
        {
            new tbl_PersonMap(builder.Entity<tbl_Person>());
            base.OnModelCreating(builder);
        }
    }
}

데이터 액세스 레이어 클래스에 대한 IServiceCollection의 확장 메서드를 추가하여 구성에서 중복을 줄이는 것을 고려할 수도 있습니다. 특히 일반적인 서비스를 추가 할 때 더욱 그렇습니다.


인기 답변

이 방법을 찾았지만 여전히 최선의 방법이라고 확신하지 못합니다. 내 삽입 함수를 보유하고있는 클래스 파일에서 웹 API 프로젝트에서 호출 될 때 웹 API의 appcontext가 데이터 라이브러리 프로젝트에 전달되도록이 코드를 추가했습니다. 그것으로 나는 더 우아한 접근 방법이 있는지 확신하지 못한다.

public class fnCommon
{
    private readonly AppContext db;

    public fnCommon(AppContext context)
    {
        this.db = context;
    }

    public int InsertPerson(tbl_Person person)
    {

        try
        {
            db.tbl_Person.Add(person);
            db.SaveChanges();
            return person.PersonID;
        }

        catch
        {
            return 0;
        }
    }
}



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.