Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将记录Linq更新为SQL_C#_Asp.net_Linq To Sql - Fatal编程技术网

C# 将记录Linq更新为SQL

C# 将记录Linq更新为SQL,c#,asp.net,linq-to-sql,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["Ve

我正在读一本书-使用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保存在会话变量中 然后从数据库中获取记录,进行更改,然后提交更改

更新

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

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

就生成的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

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

如果关闭viewstate并使用隐藏字段,则页面加载速度可能会更快(因为维护viewstate时会出现膨胀)。但这可能会影响功能

此外,代码中的linq to sql语句将生成与本书不同的结果,因此我假设本书代码不会按照您的意愿进行更新,而不会适应您的需要


@Matthew是对的,如果您有安全顾虑,那么明文隐藏字段是存储内容(+1)的不好地方。

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

问题不是关于变量,而是其他人更改了我的标题。我已经更改了问题以反映我原来的问题。这可能导致会话膨胀,并可能导致可伸缩性问题。只要你的应用程序具有安全性,不允许访问用户不应该访问的数据,那么在ViewState或隐藏字段中存储这些信息应该不会有任何问题。这不是使用会话的好理由。好的,但在第一个示例中,我需要更新记录的所有值,在我的场景中,我只需要更新更改的字段。因此,如果我未能设置字段,第一种场景是否不会有用null覆盖数据的风险?谢谢。不,Sql update语句是通过尝试确定您已更改的列/字段生成的,因此它不会更新未提及的列,或者如果它认为您未更改值,则不会更新。非常感谢,非常感谢您的帮助!我应该指出一件事要注意。对于第一种方法,您的C#代码不知道数据库中的实际值是什么。因此,如果MyUserAccount类将blah初始化为空字符串,则行ua.blah=“”;不会被视为更改,因此该列不会包含在update语句中。如果数据库中的列实际上有一个要删除的值,则可能需要执行类似ua.Blah=“dummyValue”的操作;ua.Blah=null,因此Linq2Sql知道您已经更改了该列,并将生成类似更新MyUserAccount集的Sql Blah=null…好的,我更新了问题,我不想知道保存UserAccountID的最佳方法是什么,但是,使用Linq to SQL更新数据库中记录的最佳方法是什么呢?所有无关的代码让人们感到困惑。编辑您的答案,使其仅包含您正在询问的两种形式的linq to sql,而忽略其余部分。