2009-06-11 28 views
1

私はLINQ to SQLのを使用していている(3層のアプローチを使用して)プロジェクトを開発しています... 私は、ユーザーを更新したい...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で

はこの後

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

BLLクラスです。それは私に以前の詳細を示しています。 BM_UserのPARAMTERがそれに接続されていないので、

は親切に、この問題は、新しいのDataContextを宣言しているあなたのUpdateUser方法で

答えて

2

を解決する...それは新しいものと、ユーザーの詳細を更新していない意味し、それが理由ですSubmitChangesメソッドは何もしません。

+0

hmm。 OKこの問題を解決する方法....私はdb.BM_User.Attach(ユーザー)を行う場合、それは私にエラーを与える。このエンティティを接続できません。他の場所で宣言されています。これは不可能です。 – Mohsan

+0

私はあなたのクラス設計を再度見て、あなたの "UserManagerDAO"クラスのDataContextを扱うべきであると思うし、GetUserByName(username)もあなたの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

または、同じデータコンテキストを渡して、誰もが同じものを使用するようにすることができます。 –

+0

ではなく、タイムスタンプを使用してください。私はデータベース内のすべてのテーブルを変更したくない。 – Mohsan

+0

誰かがこの問題を解決してください:(((( – Mohsan

関連する問題