2009-06-11 2 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

В вашем методе UpdateUser вы объявляете новый DataContext, поэтому параметр Я BM_User не привязан к ней и вот почему Метод SubmitChanges ничего не делает.

+0

hmm. хорошо, как решить эту проблему .... ???? если я делаю db.BM_User.Attach (пользователь), это дает мне ошибку. который не может присоединить этот объект. он объявляется в некоторых местах. это невозможно. – Mohsan

+0

Я думаю, вам стоит снова взглянуть на свой классный дизайн и, возможно, обработать DataContext в вашем классе UserManagerDAO, также GetUserByName (имя пользователя) также не должно быть на вашем классе DAO? – CMS

+0

Метод GetUserByName (имя пользователя) является частью UserCatalog, который фактически вызывает метод GetUserByName (имя пользователя) класса UserManagerDAO ... – 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