LINQ TO SQL ::数据更新问题

时间:2009-06-11 18:07:18

标签: c# asp.net linq-to-sql

我正在开发一个项目(使用3层方法),我在其中使用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 个答案:

答案 0 :(得分:2)

在您的UpdateUser方法中,您声明了一个新的DataContext,因此没有附加DM_User参数,这就是SubmitChanges方法什么都不做的原因。

答案 1 :(得分:1)

问题是UserManagerDAO.UpdateUser中的用户来自不同的数据上下文。为此,如果要跨越上下文边界,则必须使用LINQ的序列化。

这有几种方法可以解决这个问题。

  1. 向表中添加一个ROWVERSION列,并将其与您的对象保持一致。完成后,将对象附加回数据上下文,更新应按预期工作。
  2. 在更新方法中重新选择记录,然后手动将更新对象中的属性复制到所选对象。如果你想让它适用于你的所有表而不仅仅是这个表,你也可以使用反射。示例代码如下。
  3. 这两个选项都是变通方法 - 我认为最好的选择是使用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上的答案。