LINQ:SubmitChanges()没有更新我的记录

时间:2011-02-05 02:48:35

标签: c# linq linq-to-sql submitchanges

这里听起来不像是破纪录(有几个帖子看起来像这个),但似乎没有一个能解决我的问题。看来当你想要更新

private bool resetPassword(string password)
{
    try
    {
       var db = new SchedulerDBDataContext();

       // since this is a instance method, I grab the ID from _this_
       AdminUser user = db.AdminUsers.SingleOrDefault(t => t.ID == _ID);

       if (user != null)
       {
           // this method DOES update these two fields.
           SchedUtil.md5Hash(password, ref user._EncryptedPassword, ref user._PasswordSalt);

           // I threw these in there to try something... it didn't work.
           //user._EncryptedPassword = user.EncryptedPassword;
           //user._PasswordSalt = user.PasswordSalt;

           // this DOESN'T do anything.
           db.SubmitChanges();
           return true;
       }

       return false;
    }
    catch (Exception)
    {
        return false;
    }
}

也许这是一个愚蠢的问题,但我正在从数据库中检索this ...为什么不只是更新this的属性。我猜我需要通过DBContext来猜它。

4 个答案:

答案 0 :(得分:4)

您应该设置公共属性而不是私有值。

  // I threw these in there to try something... it didn't work.
       //user._EncryptedPassword = user.EncryptedPassword;
       //user._PasswordSalt = user.PasswordSalt;

这不会触发任何更新。

即使你这样做:

      user.EncryptedPassword = user._EncryptedPassword;
      user.PasswordSalt      = user._PasswordSalt;

这不会触发任何更改,因为您实际上没有更改值

您可以执行类似

的操作
 string newEncryptedPassword;
 string newPasswordSalt;

 SchedUtil.md5Hash(password, ref newEncryptedPassword, ref newPasswordSalt);

 user.EncryptedPassword = newEncryptedPassword;
 user.PasswordSalt      = newPasswordSalt;

同时检查您的表是否有主键,否则Linq将不会跟踪更改。

答案 1 :(得分:3)

DJ,

你确定

user._EncryptedPassword , 
user._PasswordSalt 

属性?我认为你LINQ TO SQL创建了公共和私有属性。

你可以设置它们吗

user.EncryptedPassword , 
user.PasswordSalt
像这样?

韦达

答案 2 :(得分:0)

要对代码进行问题排查,请尝试以下任何建议:

  • 在调试代码时,我假设你的对象不是null。
  • 确保您的属性实际已更改。你使用管道前缀字段名称很奇怪,但无论如何:在调试时,检查你的属性是否真的有新值。
  • 使用SQL Server Profiler捕获发送到数据库服务器的SQL语句。然后,您将能够将此UPDATE查询重新运行回SQL Management Studio,并确定受影响的记录数。您还可以看到UPDATE语句中传递的值。

答案 3 :(得分:0)

Ved指出了一个可能的问题。如果不起作用,您应该仔细检查LINQ to SQL类'AdminUser类定义,并确保生成的代码实现INotifyPropertyChangingINotifyPropertyChanged接口。在某些情况下,设计人员不会实现阻止更新工作的这些接口。例如,不要声明主键。