2013-10-25 3 views
0

기본 헬퍼, 사용자 기능 등 모든 프로젝트에 필요한 것들을 포함하는 MVC4 "템플릿"을 만들었습니다.여러 프로젝트에서 DbContext 분리하기

컨트롤러/모델/뷰, 비즈니스 계층 및 데이터 계층의 세 부분으로 구성된 부품을 분리하려고합니다.

이제 데이터 레이어 부분을 꺼내 개인 Nuget 패키지가 될 별도의 프로젝트에 배치하는 문제에 직면했습니다.

그러나 패키지는 실제 프로젝트 웹 사이트의 DataLayer에 있기 때문에 DbContext에 대해 알 수 없습니다.

웹 사이트에 대한 DbContext는 현재 다음과 같습니다

public class DataContext : DbContext 
{ 
    .... 
    public DbSet<Language> Languages { get; set; } 
    public DbSet<User> Users { get; set; } 
    .... 
    public DbSet<Reservation> Reservations { get; set; } 
    .... 
} 

LanguagesUsers는 별도의 프로젝트/NuGet 패키지로 이동하고이 사이트의 특정와 같이 Reservations 웹 사이트에 남아있을 것입니다.

LanguagesUsers 테이블은 서로에 대한 참조가 없지만, 두 UserLanguage 참조를 Reservations 갖는다.

마이 그 레이션을 포함하여 완전한 코드 우선 모델을 유지하기위한 옵션은 무엇입니까? 별도로 NuGet/NuGet 프로젝트마다 복수 DbContext을 생성 할 수 있습니까? 코드를 처음으로 마이그레이션하면이 문제를 해결할 수 있습니까? 더 좋은 방법이 있습니까?

답변

1

예약에 언어 및 사용자 클래스에 대한 링크가있는 경우 동일한 컨텍스트를 사용해야합니다.

좀 더 느슨하게 결합 된 구현을 원할 경우 실제 클래스 대신 ID를 포함하면 별도의 컨텍스트를 사용할 수 있지만 객체 참조 등이 쉽지 않습니다. 구현은 실제로 프로젝트의 규모와 솔루션 업데이트 방법에 따라 다릅니다.

+0

문제는 동일한 "백도어"를 사용하는 웹 사이트가 여러 개있는 것입니다. 버그가 업데이트되면이 모든 프로젝트를 거쳐 소스의 버그를 업데이트해야합니다. 패키지를 사용하면 그 문제는 발생하지 않습니다. – YesMan85

+0

리포지토리 모델과 인터페이스를 사용하여 실제 구현을 분리해야합니다. 이렇게하면 프런트 엔드 사이트에서 구현 세부 정보 (EF Context)를 숨길 수 있습니다. 따라서 DataContext를 프론트 엔드에 노출하는 대신 IBackofficeService 또는 유사한 것을 반환합니다. 그런 다음 DataContext를 사용하여 해당 인터페이스를 만들고 구현합니다. 또한 일종의 IoC (Inversion of Control) 라이브러리 인 Unity를 사용하는 것을 고려해야합니다. 구현을 등록하고 MVC에서이 MyController (IBackofficeService 서비스)와 같은 컨트롤러를 만들 수 있습니다. – Woland

+0

EF와 같은 접근법을 구현하는 방법에 대한 안내서입니다. http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-the-repository-and-unit-of -work-patterns-in-an-asp-net-mvc-application을 사용합니다. 저장소 모델 [virtocommerce] (http://virtocommerce.codeplex.com) – Woland