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

после этого, когда я получу подробную информацию об этом обновленном пользователе. он показывает мне предыдущую деталь. означает, что он не обновляет данные пользователя новыми ...

пожалуйста, решите эту проблему


person Mohsan    schedule 11.06.2009    source источник


Ответы (2)


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

person Christian C. Salvadó    schedule 11.06.2009
comment
Хм. ок как решить эту проблему .... ???? если я делаю db.BM_User.Attach (user), это дает мне ошибку. что не может прикрепить эту сущность. он объявлен где-то еще. это невозможно. - person Mohsan; 11.06.2009
comment
Я думаю, вам следует еще раз взглянуть на дизайн своего класса и, возможно, обработать DataContext в вашем классе UserManagerDAO, а также GetUserByName (имя пользователя) не должно быть в вашем классе DAO? - person Christian C. Salvadó; 11.06.2009
comment
Метод GetUserByName (имя пользователя) является частью UserCatalog, который фактически вызывает метод GetUserByName (имя пользователя) класса UserManagerDAO ... - person Mohsan; 11.06.2009

Проблема в том, что пользователь в 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;
            }
        }
    }
}

См. Ответ на этот вопрос, чтобы узнать больше. информация.

person Scott Ivey    schedule 11.06.2009
comment
Или вы можете передать один и тот же текст данных, чтобы все использовали один и тот же. - person Frank Schwieterman; 11.06.2009
comment
любое другое решение вместо этой отметки времени. Я не хочу менять все таблицы в базе данных. - person Mohsan; 11.06.2009