2009-06-11 110 views
1

我正在開發一個項目(使用3層的方法),其中我使用的LINQ to SQL ... 我想更新用戶...的LINQ to SQL ::數據更新問題

,但我面臨一些問題。它不給我任何錯誤,但也不更新用戶細節

這裏是程序的順序;

在UpdateProfile.aspx

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

是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; 
     } 
} 

在此之後,當我得到這個更新的用戶的細節。它顯示了我以前的細節。意味着它沒有更新的用戶與新的細節...

親切解決這個問題

回答

2

在你宣佈一個新的DataContext你UpdateUser兩個方法,所以BM_User放慢參數不重視它,這就是爲什麼SubmitChanges方法什麼都不做。

+0

hmm。好的如何解決這個問題.... ????如果我做db.BM_User.Attach(用戶)它給我錯誤。無法附加此實體。它是在其他地方聲明的。這不可能。 – Mohsan 2009-06-11 18:15:41

+0

我認爲你應該再次看看你的類設計,並且可能在你的「UserManagerDAO」類中處理DataContext,並且GetUserByName(username)不應該在你的DAO類中。 – CMS 2009-06-11 18:22:17

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的回答。