LINQ TO SQL :: Проблема обновления данных - PullRequest
1 голос
/ 11 июня 2009

Я занимаюсь разработкой проекта (используя трехуровневый подход), в котором я использую 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 ]

2 голосов
/ 11 июня 2009

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

1 голос
/ 11 июня 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;
            }
        }
    }
}

См. Ответ на этот вопрос для получения дополнительной информации.

...