2012-09-25 2 views
2

내 응용 프로그램에 대한 배경 지식. 데이터 지속성을 위해 Entity Framework 4.1을 사용하는 ASP.Net MVC 3 Web App을 개발 중입니다. 내 응용 프로그램은 UI 레이어, 서비스 레이어, 저장소 레이어 등이 계층화되어 있습니다. 또한 Inversion of Control 컨테이너에 Unity를 사용합니다.문자열 등록 정보 덮어 쓰기 문제

사용자가 내 애플리케이션에 등록하면 StringBuilder을 사용하여 두 개의 임의 코드 (이메일 및 모바일 인증 코드)를 만듭니다. 그런 다음이 두 임의의 코드를 사용자 객체의 해당 속성에 할당합니다 (아래 참조).

User validateUser = new User(); 

validateUser.firstName = model.firstName.Trim(); 
validateUser.lastName = model.lastName.Trim(); 
validateUser.email = model.Email.Trim(); 

//Create Email and Mobile Verification Codes 
string randomEmailCode = ""; 
randomEmailCode = _notifyService.GenerateEmailCode(); 
validateUser.emailVerificationCode = randomEmailCode; 

string randomMobileCode = ""; 
randomMobileCode = _notifyService.GenerateMobileCode(); 
validateUser.mobileVerificationCode = randomMobileCode; 

그때 내 DBcontext에 사용자를 추가하고 내 데이터베이스에 새 사용자를 저장() 메서드 SaveChanges를 호출

public string GenerateEmailCode() 
{ 
    StringBuilder builder = new StringBuilder(); 

    builder.Append(RandomString(4, true)); 
    builder.Append(RandomNumber(1000, 9999)); 
    builder.Append(RandomString(2, false)); 
    return builder.ToString(); 
} 

public string GenerateMobileCode() 
{ 
    StringBuilder builder = new StringBuilder(); 

    builder.Append(RandomString(3, true)); 
    builder.Append(RandomNumber(1000, 9999)); 
    builder.Append(RandomString(2, false)); 
    return builder.ToString(); 
} 

private int RandomNumber(int min, int max) 
{ 
    Random random = new Random(); 
    return random.Next(min, max); 
} 

private string RandomString(int size, bool lowerCase) 
{ 
    StringBuilder builder = new StringBuilder(); 
    Random random = new Random(); 
    char ch; 
    for (int i = 0; i < size; i++) 
     { 
      ch = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65))); 
      builder.Append(ch); 
     } 
     if (lowerCase) 
      return builder.ToString().ToLower(); 
     return builder.ToString(); 
    } 

NotifyService. 이제

_accountService.AddUser(validateUser); 
_accountService.Save(); 

, 내 데이터베이스에 가서 추가 된 새로운 사용자를 찾습니다 emailVerificationCodemobileVerificationCode은 모두 동일합니다. 그러나, 나는 다음 줄

randomEmailCode = _notifyService.GenerateEmailCode(); 

에 내 코드에 중단 점을 넣고, 새로운 사용자에 대한 데이터베이스를 확인 모두 emailVerificationCodemobileVerificationCode 코드 이동하고 저장까지를 통해 추적하고있는 경우 기대 한대로 다릅니다.

응용 프로그램을 실행할 때 두 속성에 대해 동일한 코드가 삽입되는 이유를 이해할 수 없습니다.

아무도 도와 드릴 수 있습니까?

감사합니다. UPDATE 제인이 제안 내가 한

, 즉, 너무

validateUser.emailVerificationCode = "emailCode"; 
validateUser.mobileVerificationCode = "mobileCode"; 

다시 응용 프로그램을 실행 등의 각 속성,이 시간 동안 하드 코딩 값을 넣어 두 개의 하드 코딩 된 값이 삽입 된

예상대로 이것은 내 두 방법이 GenerateEmailCode()GenerateMobileCode()이 올바르게 작동하지 않는다는 것을 의미합니까?

+0

그래서이 코드는 다르다? – Thousand

+0

@ JaneDoe 예 Jane, 디버깅 할 때만 다릅니다. – tgriffiths

+0

그리고 실행할 때 어떤 코드가 중복됩니까? 모바일 또는 전자 메일 코드? – Thousand

답변

3

아마 임의의 코드를 생성하는 방식에 문제가있을 수 있습니다. 다른 사람들이 지적했듯이 문제는 무작위 클래스의 인스턴스를 너무 가깝게 만드는 것일 가능성이 큽니다.(어떤 방법으로 당신이 코드가 최대 분명히 발생하지만,이 같은 일이 당신에게를 제공해야합니다 :

static Random r = new Random(); 

는 다음 코드를 생성하는 정적 랜덤를 사용

정적 랜덤 생성기를 선언하려고 내가이 프로그램을 실행할 때

public static string generateCode() 
     {   
      string chrs = "abcdefghijklmnopqrstuvwxyz"; 
      char[] arr = chrs.ToCharArray(); 
      string code = ""; 
      for (int i = 0; i < 5; i++) 
      { 
       code += arr[r.Next(arr.Count())]; 
      } 
      return code; 
     } 

는 : 아이디어)

var firstCode = generateCode(); 
var secondCode = generateCode(); 

내가 2 DIF를 얻을 수 ferent 값. 디버깅 할 때

here's another helpful link

+0

Jane에게 감사드립니다. – tgriffiths

관련 문제