2009-06-11 8 views
1
전 (3 계층 접근 방식을 사용하여) 프로젝트있는 내가 ... 내가 사용자를 업데이트 할 을 SQL로 LINQ를 사용하고 개발하고

...LINQ는

데이터 업데이트 문제 :: SQL TO하지만 나는 어떤 문제에 직면 해있다. 그것은 나에게 어떤 오류도주지 않고 사용자의 세부 사항을 업데이트하지 않는다.

여기 프로그램 순서는 다음과 같다.

String currentUser = Session["BMUser"].ToString(); 

      String displayName = txtDisplayName.Text; 
      String username = currentUser; 
      String emailAddress = txtEmailAddress.Text; 
      String secretQuestion = txtSecretQuestion.Text; 
      String secretAnswer = txtSecretAnswer.Text; 

       if (UserManager.UpdateProfile(username, displayName, emailAddress, secretQuestion, secretAnswer)) 
       { 
        lblStatus.Text = "Profile Updated"; 
       } 
       else 
        lblStatus.Text = "Unable to Update Profile"; 

UserManager UpdateProfile.aspx

에서

는 BLL 클래스

public class UserManager 
{   
     public static bool UpdateProfile(String username, String displayName, String emailAddress, String secretQuestion, String secretAnswer) 
     { 

     // This method will return BM_User (BM_User in entity class generated by LINQ TO SQL)  

      BM_User user = UserCatalog.GetUserByName(username); 
      if (user != null) 
      { 
       user.DisplayName = displayName; 
       user.EmailAddress = emailAddress; 
       user.SecretQuestion = secretQuestion; 
       user.SecretAnswer = secretAnswer;    

       if (UserManagerDAO.UpdateUser(user, false)) 
       { 
        //HttpContext.Current.Session["BMUser"] = userToUpdate; 
        return true; 
       } 
       else 
        return false; 
      } 
      else 
       return false; 
     } 
} 

이 후 마지막으로 UserManagerDAO

public class UserManagerDAO 
{ 
    public static bool UpdateUser(BM_User user, bool changeLoginDateTime) 
     { 
      BugManDataContext db = new BugManDataContext();    

      if (changeLoginDateTime == true) 
       user.LastLoginDate = DateTime.Now;    
      db.SubmitChanges(); 
      return true; 
     } 
} 

내가이 업데이트 된 사용자의 세부 사항을 얻을 때입니다. 이전 세부 사항을 보여줍니다. BM_User에 있었던 파라미터가 첨부되지 않도록

친절이 문제는 새의 DataContext를 선언하는 당신의 UpdateUser 방법에

답변

2

를 해결 ... 그것은 새와 사용자의 세부 사항을 갱신하고 있지 않음을 의미하고 그 이유입니다 SubmitChanges 메서드는 아무 작업도 수행하지 않습니다.

+0

hmm. 확인이 문제를 해결하는 방법 .... ??? 만약 내가 db.BM_User.Attach (사용자) 할 날 오류가 발생합니다. 이 엔티티를 연결할 수 없습니다. 그것은 다른 곳에서 선언됩니다. 이건 불가능 해. – Mohsan

+0

나는 당신이 다시 클래스 디자인을보아야하고, 아마도 "UserManagerDAO"클래스의 DataContext를 처리해야하고 GetUserByName (사용자 이름)도 DAO 클래스에 있으면 안된다고 생각한다 ?? – CMS

+0

GetUserByName (username) 메소드는 실제로 UserManagerDAO 클래스의 GetUserByName (username) 메소드를 호출하는 UserCatalog의 일부입니다 ... – Mohsan

1

문제는 UserManagerDAO.UpdateUser의 사용자가 다른 데이터 컨텍스트에서 온 것입니다. 이렇게하려면 컨텍스트 경계를 넘나들려면 LINQ의 직렬화를 사용해야합니다.

다음은이 문제를 해결할 수있는 몇 가지 방법입니다.

  1. 테이블에 ROWVERSION 열을 추가하고 개체와 함께 유지하십시오. 이 작업을 완료하고 개체를 데이터 컨텍스트에 다시 연결하면 업데이트가 예상대로 작동합니다.
  2. 업데이트 방법에서 레코드를 다시 선택하고 업데이트 된 개체의 속성을 선택한 개체로 수동으로 복사합니다. 이 테이블 대신 모든 테이블에서 작동하게하려면 반성을 사용할 수도 있습니다. 이에 대한 샘플 코드는 다음과 같습니다.

두 가지 옵션이 모두 해결 방법입니다. 제 생각에는 linq 직렬화를 사용하는 것이 가장 좋지만 옵션이 아니면 다음 중 하나를 시도해보십시오.

// example code for #2 above... 
public class UserManagerDAO 
{ 
    public static bool UpdateUser(BM_User user, bool changeLoginDateTime) 
    { 
     using(BugManDataContext db = new BugManDataContext()) 
     { 

      // lookup the current user in the database. 
      var dbUser = (from u in db.Users 
          where u.Id == user.Id 
          select u).Single(); 

      if (changeLoginDateTime == true) 
      { 
       // update all the fields from your passed in user object 
       dbUser.Field1 = user.Field1; 
       dbUser.Field2 = user.Field2; 
       dbUser.Field3 = user.Field3; 
       dbUser.LastLoginDate = DateTime.Now 
       dbUser.LastLoginDate = DateTime.Now; 

       db.SubmitChanges(); 
       return true; 
      } 
     } 
    } 
} 

자세한 내용은 this question의 대답을 참조하십시오.

+0

또는 모든 사용자가 동일한 데이터를 사용하도록 동일한 datacontext를 전달할 수 있습니다. –

+0

다른 솔루션 대신 시간 소인. 내가 데이터베이스에있는 모든 테이블을 변경하고 싶지 않아. – Mohsan

+0

누군가이 문제를 해결하십시오 : (((( – Mohsan