更新记录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更新数据库中记录的最佳方法。

就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 

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

书中的例子是在viewstate中存储useraccount和版本信息 – 这是一个很大的隐藏字段,asp.net用它来维护状态和存储表单变量。事实上,如果你有viewstate转换,你的隐藏字段可能会在viewstate中上。

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

您的代码中的linq to sql语句也会产生与本书不同的结果 – 所以我假设书籍代码不会按照您的意愿更新,而不会根据您的需要进行调整。

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

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