2011-10-31 191 views
3

我正在读一本书 - 使用Visual Studio 2008进行ASP.Net 3.5企业应用程序开发,当它谈到使用Linq-to-SQL更新数据库中的记录时,它使用以下代码:更新记录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到SQL的方式来更新记录。所以我改变了代码以使用会话变量,并将标题恢复为原始。请阅读整个问题,因为我只是在寻找最好的方法来使用Linq-to-SQL更新数据库中的记录。

+0

你让所有无关代码混淆的人。编辑你的答案只包括你所问的关于linq到SQL的两种形式,并忘记其余的部分。 –

回答

1

在SQL方面产生的前者将产生一个SQL语句像

Update MyUserAccount set [email protected] where UserAccountID = @UserAccountID 

而后者会产生

Select UserAccountID, Blah, .... From MyUserAccount where UserAccountID = @UserAccountID 
Update MyUserAccount set [email protected] where UserAccountID = @UserAccountID 
+0

好吧,但在第一个示例中,我需要更新记录的所有值,并且在我的场景中,我只需要更新更改的字段。那么如果我没有设置字段,那么第一个场景会不会有用null覆盖数据的风险?谢谢。 – Wade73

+0

不,Sql更新语句是通过尝试确定哪些列/字段已更改而生成的,因此它不会更新未提及的列或者它认为您没有更改该值。 – sgmoore

+0

非常感谢,非常感谢您的帮助! – Wade73

1

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

+0

问题不是关于变量,其他人改变了我的头衔。我改变了这个问题来反映我的原始问题。 – Wade73

+1

这可能会导致会话膨胀,并可能导致可伸缩性问题。在ViewState或隐藏字段中存储此信息不应有任何问题,只要您的应用程序具有安全性,但不允许访问用户不应该访问的数据。这是使用会话的一个不好的理由。 –

0

该示例从本书是存储在useraccount和版本信息viewstate - 这是一个asp.net用来维护状态和存储窗体变量的大隐藏字段。事实上,如果您打开了viewstate,您的隐藏字段可能会处于视图状态。

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

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

@Matthew是正确的,如果你有安全问题,那么明文隐藏字段是一个不好的地方存储的东西(+1)。

0

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

+0

好吧,我更新了这个问题,我不是在寻找什么是保存UserAccountID的最佳方式,但什么是使用Linq-to-SQL来更新数据库中记录的最佳方法。 – Wade73