2009-06-11 9 views
1

Je développe un projet (en utilisant l'approche 3 niveaux) dans lequel j'utilise LINQ to SQL ... je veux mettre à jour l'utilisateur ...LINQ to SQL :: Mise à jour des données Problème

mais je suis faire face à un problème. il ne me donne pas d'erreur mais également ne pas mettre à jour le détail de l'utilisateur

voici la séquence du programme;

dans 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"; 

la UserManager est BLL classe

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

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

après quand je reçois le détail de cet utilisateur mis à jour. ça me montre les détails précédents. dire qu'il ne soit pas mise à jour le détail de l'utilisateur avec une nouvelle ...

résoudre bien vouloir ce problème

Répondre

2

Dans la méthode UpdateUser vous déclarez un nouveau DataContext, de sorte que le paramter BM_User n'est pas attaché à elle et c'est pourquoi la La méthode SubmitChanges ne fait rien.

+0

hmm. ok comment résoudre ce problème .... ???? si je fais db.BM_User.Attach (utilisateur), il me donne une erreur. qui ne peut pas attacher cette entité. il est déclaré dans certains où d'autre. ce n'est pas possible. – Mohsan

+0

Je pense que vous devriez regarder à nouveau votre conception de classe, et peut-être gérer un DataContext dans votre classe "UserManagerDAO", aussi GetUserByName (nom d'utilisateur) ne devrait pas être sur votre classe DAO aussi ?? – CMS

+0

La méthode GetUserByName (nom d'utilisateur) fait partie de UserCatalog qui appelle réellement la méthode GetUserByName (nom d'utilisateur) de la classe UserManagerDAO ... – Mohsan

1

Le problème est que l'utilisateur dans UserManagerDAO.UpdateUser provenait d'un contexte de données différent. Pour ce faire, vous devrez utiliser la sérialisation de LINQ si vous voulez traverser les limites de contexte.

Voici quelques façons de contourner ce problème. Ajoutez une colonne ROWVERSION à votre table et persistez avec votre objet. Une fois que vous avez fait cela, et que vous attachez l'objet à votre contexte de données, la mise à jour devrait fonctionner comme prévu.

  • resélectionnez l'enregistrement dans votre méthode de mise à jour et copiez manuellement les propriétés de votre objet mis à jour dans l'objet sélectionné. Vous pouvez également utiliser la réflexion pour cela si vous voulez que cela fonctionne pour toutes vos tables au lieu de celle-ci. Exemple de code pour cela est ci-dessous. Ces deux options sont des solutions de contournement - la meilleure option à mon avis serait d'utiliser la sérialisation linq, mais si ce n'est pas une option, essayez l'une d'entre elles.

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

    Voir la réponse sur this question pour plus d'information.

  • +0

    Ou vous pouvez transmettre le même datacontext pour que tout le monde utilise le même. –

    +0

    toute autre solution plutôt que l'horodatage. Je ne veux pas changer toutes les tables dans la base de données. – Mohsan

    +0

    s'il vous plaît quelqu'un à résoudre ce problème: ((((( – Mohsan

    Questions connexes