2012-02-20 4 views
1

정적 DBContext 멤버가있는 도우미 클래스가 비 정적 DBContext 변수와 다른 값으로 모델의 부울 필드를 채우는 상황이 있습니다. 후자는 올바른 변수를 얻고 있습니다.잘못된 값을 반환하는 정적 DBContext

이 경우 "isAdmin"이 true로 설정된 데이터베이스에서 지정된 사용자 이름을 가진 사용자가 있습니다. 정적 멤버는 isAdmin = false를 사용하여 User 객체를 반환하고 다른 멤버는 예상대로 true를 반환합니다. 아래를 참조하십시오.

왜 이런 일이 일어날 지 알고 있습니다. 여기

는 모델 :

public class User 
{ 
    [Required] 
    public int UserID { get; set; } 
    [Required] 
    public string username { get; set; } 
    [Required] 
    public bool isAdmin { get; set; } 
} 

그리고 문제가있는 헬퍼 클래스는 다음과 같습니다

public static class UserAuthHelper 
{ 
    private static SSBPDContext db = new SSBPDContext(); 
    public static User getUser(string username, string plaintextPassword) 
    { 
     var users = db.Users.Where(u => u.username.Equals(username)); 

     User user = (from u in db.Users 
        where u.username.Equals(username) 
        select u).FirstOrDefault(); 
     //this user has isAdmin = false 
     User otherUser; 
     using (var db2 = new SSBPDContext()) 
     { 
      otherUser = (from u in db2.Users 
         where u.username.Equals(username) 
         select u).FirstOrDefault(); 
      //otherUser has isAdmin = true 
     } 

    } 
} 
+0

제목 앞에 "C# MVC3 -"등을 붙이지 마십시오. 그것이 바로 태그가있는 것입니다. –

+0

오, 죄송합니다. 고쳐 주셔서 감사합니다. –

답변

1

요청한 엔티티를 DBContext가 캐시하기 때문에 다음 번에 동일한 엔티티에 대해 동일한 DBContext를 요청하면 메모리에서 가져 와서 데이터베이스를 다시 쿼리하지 않습니다. 따라서 해당 DBContext 외부의 해당 엔터티에 대한 모든 변경 사항이 무시됩니다.

3

귀하의 상황에 맞는 정적해서는 안됩니다. 요청 당 하나씩 만듭니다. 의존성 주입이 도움이 될 수 있습니다 (별도의 질문/답변입니다)

문맥은 스레드로부터 안전하지 않으므로 여기에서 문제를 파악해 볼 필요가 없습니다.

+0

스레드 안전성은 여기서 문제가되어서는 안됩니다. 나는이 데이터베이스를 사용자 데이터베이스에서 한 줄로 로컬로 실행하고 있으며 정적 컨텍스트는 매번 부울 필드를 잘못 채 웁니다. 스레드 세이프가 아니라는 점을 알아두면 좋을 것입니다. 더 이상 사용하지 않을 것입니다. 그러나 이것이 왜 일어날 지에 대한 통찰력을 얻기를 바랍니다. –

+0

다른 것을 보지 않고 여기에서 말하기가 어렵습니다. 예를 들어 누락 된 세부 정보가있을 수 있습니다 - 둘 다 동일한 데이터베이스를 찾고 있습니까? 확실합니까? 하나의 설명은 하나의 컨텍스트가 연결 문자열을 갖지 않거나 (또는 ​​틀린 것을 찾을 수없는) 초기화 된 데이터로 데이터베이스를 생성하는 것입니다. 당신은 나에게 여기에서 소리 치고, '나는 어떤 데이터도 초기화하지 않는다.'라고 말하며, 이드는 충분히 공정하다고 말하지만, 게시 된 세부 사항에서 말할 수는 없다. 어떤 DB 엔진을 사용하고 있습니까? 질의를 확인하기 위해 SQL 프로파일을로드하거나 EFProf 평가판을 사용하여 컨텍스트/쿼리를 프로파일 링하여 통찰력을 제공하십시오. –

+0

그들은 똑같은 맥락이고, 올바른 데이터베이스를 치고 있다는 것을 확신합니다 - 다른 모든 필드 (간략하게하기 위해 여기에 남아 있습니다)가 정확하게 채워지고 있습니다. 현재 SQLCompact를 사용하고 있습니다 (첫 번째 MVC 앱 구축). SQL 프로파일 러 팁을 주셔서 감사합니다. –

관련 문제