我正在阅读一本书 - 使用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更新数据库中记录的最佳方法。
答案 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在数据上添加了一些加密功能,因此与使用原始隐藏字段相比,它不容易被篡改。使用用户信息的最佳方法是将其存储在会话中。