Bezdepbonusu7Программирование: статьи и ответы

Вопрос

LINQ TO SQL :: проблема обновления данных

Автор вопроса: MohsanОтветов: 2

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

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

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

linq-to-sql

Ответы

Ответ 1 · рейтинг 2 · Christian C. Salvadó

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

Ответ 2 · рейтинг 1 · Scott Ivey

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы