更新记录Linq-to-SQL

时间:2011-10-31 17:41:36

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

我正在阅读一本书 - 使用Visual Studio 2008进行ASP.Net 3.5企业应用程序开发,当它讨论使用Linq-to-SQL更新数据库中的记录时,它使用以下代码:

MyUserAccount ua = new MyUserAccount
{
... Update fields
};

ua.UserAccountID = Convert.ToInt32(session["UserAccountID"]);
ua.Version = Convert.ToInt32(session["Version"]);

MyDataContext db = new MyDataContext();
db.MyUserAccounts.Attach(ua,true);
db.SubmitChanges();

与我习惯的相比,我只是将AccountID保存在会话变量中 然后从数据库中获取记录,进行更改,然后提交更改。

BtnUpdate

int UserAccountID = Convert.ToInt32(Request["UserAccountID"]);

//Get User fron Context
MyDataContext db = new MyDataContext();
MyUserAccount ua = db.MyUserAccounts.Single(
     x => x.UserAccountID == UserAccountID);

//Make changes
ua.Blah = "";

db.SubmitChanges();

所以我的问题是这样做的首选方法是什么?在过去没有看到这个,我不确定首选或最佳方式是什么。任何帮助表示赞赏。

瓦德

注意:

我原来的问题,有人改变了我的标题,是什么是最好的Linq-to-SQL方式来更新记录。所以我更改了代码以使用会话变量,并将标题恢复为原始版本。请阅读整个问题,因为我只是在寻找使用Linq-to-SQL更新数据库中记录的最佳方法。

4 个答案:

答案 0 :(得分:1)

不要这样做,将关键数据存储到会话中。隐藏字段(viewstate是隐藏字段)可能被用户篡改。会话将阻止用户更改值。

答案 1 :(得分:1)

就生成的sql而言,前者会生成类似

的Sql语句
Update MyUserAccount set blah=@Blah where UserAccountID = @UserAccountID

而后者将产生

Select UserAccountID, Blah, ....  From MyUserAccount where UserAccountID = @UserAccountID
Update MyUserAccount set blah=@Blah where UserAccountID = @UserAccountID

答案 2 :(得分:0)

本书中的示例是将useraccount和版本信息存储在viewstate中 - 这是一个很大的隐藏字段,asp.net用它来维护状态和存储表单变量。实际上你的隐藏字段可能是在视图状态中,如果您打开了viewstate。

如果关闭视图状态并使用隐藏字段,则页面可能加载速度更快(由于维护视图状态所涉及的膨胀)。但这可能会影响功能。

您的代码中的linq to sql语句也会产生与本书不同的结果 - 所以我假设书籍代码不会按照您的意愿更新而不适应您的需要。

@Matthew是正确的,如果您有安全问题,那么明文隐藏字段是存储内容的坏地方(+1)。

答案 3 :(得分:0)

Viewstate在数据上添加了一些加密功能,因此与使用原始隐藏字段相比,它不容易被篡改。使用用户信息的最佳方法是将其存储在会话中。