2012-05-22 3 views
0

MVC 웹 응용 프로그램에서 사용자 지정 MembershipProvider를 만들었습니다. 내 GetUser 함수는 표준 MembershipUser에서 상속받은 내 자신의 사용자 지정 Employee 클래스의 인스턴스를 반환합니다. 이를 통해 다양한 직원 세부 사항과 같은 각 사용자에 대한 추가 세부 정보를 제공 할 수 있습니다.ASP.NET 사용자 지정 MembershipProvider 및 공유 DbContext

public override MembershipUser GetUser(string username, bool userIsOnline) 
    { 
     return new ModelRepository().GetModels<Employee>().Where(e => e.UserName == username).FirstOrDefault(); 
    }   

제가하는 데 문제는, 멤버 자격 공급자는 직원 개체를 검색 (새로운 DbContext가 생성하는) 내 저장소 클래스의 새로운 인스턴스를 생성합니다. 이 Employee 객체는 Membership API라고하는 요청/컨트롤러 작업에 전달됩니다.

Employee currentUser = (Employee)Membership.GetUser(); 

는 호출 요청이 종종 메모리에 새로운 객체를 생성 할 것이다, 새로운 SicknessRecord 말을하고 그 기록에 이전 검색 한 사용자를 할당하고 그 자신의 모델 저장소로 DB에 저장할 수 있습니다. 아마도 이것이 어디로 가는지 볼 수 있습니다. 프레임 워크는 객체 (사용자)를 처음에 검색하지 않은 컨텍스트로 저장하려고한다는 불평을합니다.

내 현재의 다소 해킹 된 해결책은 Membership.GetUser에서 검색 한 사용자의 ID를 사용하고 현재 모델 저장소에서 Employee 개체를 다시 검색하는 것입니다.

newSickness.Employee = this.modelRepository.GetModelById<Employee>(this.me.Id.Value); 

나는 직원 객체를 분리하려했지만 그것은 그 게으른로드 속성을 잃고 나는 시도하고 내 현재 저장소/컨텍스트에 다시 연결하는 것을 기억해야합니다.

사용자 지정 멤버 자격 공급자에게 현재 요청과 동일한 컨텍스트를 공유하는 것이 좋습니다. 이를 달성하는 방법에 대한 아이디어가 있다면 어떻게하면 사용자가 컨트롤러 작업을 실행할 때 스폰 된 멤버 컨텍스트와 동일한 컨텍스트를 멤버 공급자가 사용하도록 할 수 있습니까?

답변

0

각 컨트롤러에 대해 하나의 별도 DbContext 인스턴스를 가질 수 있습니다.

public class SomeController : Controller 
{ 
    private DbContext context = new DbContext(); 
    private CustomMembershipProvider membershipProvider = new CutomMembershipProvider(this.context); 

    ... Actions .... 
} 

내가 아는 한 컨트롤러 당 하나의 컨텍스트가 좋습니다.

그런데 여러 저장소가있는 경우 저장소 패턴으로 UnitOfWork를 사용해보십시오.

관련 문제