Linq在db中更新了一行

时间:2011-01-21 12:35:00

标签: c# linq-to-sql silverlight-4.0

我有这个功能:

//change user password
void chgPass(string username, string old_password, string new_password)
{
    var result = (from l in this.dbLogin.SLN
                 where l.user_id.Equals(username)
                 where l.password.Equals(old_password)
                 select l).First();

    result.password= new_password;

    dbLogin.SubmitChanges();
}

我称之为:

this.loginClient.chgPassAsync(user, old_password, new_password);

有人可以告诉我为什么在我运行这个时没有变化...在debuge模式中我可以看到密码字段被更改,但是当我查看db密码时没有更改。

5 个答案:

答案 0 :(得分:2)

您的SLN表是否有主键?如果没有,那么尝试设置一个,根据我的测试LINQ不会更新一个实体,而不是在它所属的表中有PK 请检查this

答案 1 :(得分:1)

Wolfy - 我首先启动SQL事件探查器以确定是否将SQL Update语句发送到目标SQL Server。如果是,我会检查以确保您没有活动,在更高级别,未提交或正在回滚的事务。最后,如果前两个问题没有解决问题,请确保您的实体发生实际变化。

我假设First()方法没有抛出异常,如果没有找到行就会发生异常。所以你的查询必须至少返回一行数据。

小心这个电话:

this.loginClient.chgPassAsync(user, old, new);

'new'是C#关键字。

答案 2 :(得分:1)

之前我已经回答了这样的问题,但是我找不到了,所以我再次在这里重复我的回答,

如果您每次运行应用程序时都将数据库文件添加到解决方案中,那么它的副本将转到您的Debug文件夹,并且您更改的文件不是原始文件,

另一个机会是您的密码数据类型为Binary,由于列数据类型和更新二进制数据中存在的问题,更新将失败

答案 3 :(得分:0)

star_password中的where l.password.Equals(star_password)来自何处?

不应该是old_password吗?

此外new是c#中的保留字,因此您应该使用其他内容 在this.loginClient.chgPassAsync(user, old, new);

答案 4 :(得分:0)

你的方法看起来很奇怪。什么是usernamenestar_password

应该更像这样:

    void chgPass(string username, string old_password, string new_password) 
    { 
        var result = this.dbLogin.SLN.FirstOrDefault(l => l.user_id == username 
                          && l.password == old_password);
        if(result == null) 
            throw new ArgumentException("User not found", "username");

        result.password = new_password; 
        this.dbLogin.SubmitChanges(); 
    }