C# 使用LINQ向sql添加新用户
我正在尝试Linq to SQL来访问我的SQL server。我有一个用户表,其中包含字段的uid、用户名和密码。我为我的dbcontext创建了linq到sql类 我可以使用我的login.aspx.cs中的登录屏幕连接到我的站点:C# 使用LINQ向sql添加新用户,c#,asp.net,linq,linq-to-sql,C#,Asp.net,Linq,Linq To Sql,我正在尝试Linq to SQL来访问我的SQL server。我有一个用户表,其中包含字段的uid、用户名和密码。我为我的dbcontext创建了linq到sql类 我可以使用我的login.aspx.cs中的登录屏幕连接到我的站点: protected void Login1_Authenticate(object sender, AuthenticateEventArgs e) { bool authenticated = false;
protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)
{
bool authenticated = false;
TrackToolDataContext data = new TrackToolDataContext();
authenticated = IsValidUser(Login1.UserName, Login1.Password);
e.Authenticated = authenticated;
if (e.Authenticated == true)
{
Session["username"] = Login1.UserName;
Response.Redirect("Welcome.aspx");
}
}
private bool IsValidUser(string un, string pw)
{
TrackToolDataContext data = new TrackToolDataContext();
var userResults = from u in data.UserDetails
where u.username == un
&& u.password == pw
select u;
return Enumerable.Count(userResults) > 0;
}
但是当我尝试创建一个新的用户屏幕时,我遇到了困难。
我在模仿我的表的用户类中创建了常规用户名和密码字段,在我的新用户页面中,我尝试从用户类中获取所有字段,并尝试将其linq到sql,我遇到以下错误:
以下是我创建新用户的代码:
protected void CreateUser_Click(object sender, EventArgs e)
{
// CreateUser(TextBox1.Text, TextBox2.Text);
User u = new User();
u.username = TextBox1.Text;
u.password = TextBox2.Text;
TrackToolDataContext data = new TrackToolDataContext();
data.UserDetails.InsertOnSubmit(u);
data.SubmitChanges();
}
你有一句话:
data.UserDetails.InsertOnSubmit(u);
但是u
被声明为User
,而不是UserDetail
,因此您将其添加到了错误的表中。尝试:
data.Users.InsertOnSubmit(u);
话虽如此,我希望这是一个测试应用程序,因为你不应该像其他人所说的那样以明文(或根本不应该)形式存储密码。错误消息应该有第二部分,它应该准确地告诉你出了什么问题 如果您的登录屏幕正常工作,那么您的表是UserDetails而不是User,因此错误可能是“无法从User转换为UserDetail”,这表明您应该创建UserDetails而不是User的实例,例如
UserDetails u = new UserDetails();
u.username = TextBox1.Text;
u.password = TextBox2.Text;
TrackToolDataContext data = new TrackToolDataContext();
data.UserDetails.InsertOnSubmit(u);
data.SubmitChanges();
在@Kirk向我指出L2S中的一个重要注释后,我能够解决这个问题,因此向他指出: 这段代码工作并保存到我的sql中
UserDetail u = new UserDetail();
u.username = TextBox1.Text;
u.password = TextBox2.Text;
TrackToolDataContext data = new TrackToolDataContext();
data.UserDetails.InsertOnSubmit(u);
data.SubmitChanges();
不要以明文形式存储密码。永远不要存储密码!将哈希存储为challange auth!我知道这一点,但这不是我主要关心的问题。OP使用的是L2S,而不是EF。
Add
是一个完全独立的框架的一部分(实体框架,继承了L2S);更准确的说法是L2S(和InsertOnSubmit
)是过时的(如果有的话)。我不确定,但我猜数据。Add()被标记为过时,而不是在DbSet中,对吗?如果我把你弄糊涂了,我是说Add在LinqToSql for 4.0框架中是过时的。我知道了,L2S,不是实体。自2008年以来,我没有使用linq to sql,我忘记了它是如何使用的。UserDetails是我的dbcontext类,User是一个类。因此,我可以实例化我的.dbml来反映UserDetails表…@Ron,我无法解析其中的大部分内容。不言而喻,TrackToolDataContext
是您的数据上下文,而不是UserDetails
。同样清楚的是,在该datacontext下确实有一个UserDetails
属性。你是说你没有Users
属性吗?如果是这样,那么User
类从何而来?TrackToolDatacontext是我的dbml,我使用linqtosql创建它并在这里定义了我的UserDetails表,方法是将它拖放到dbml中。我有一个用户类,它在类中定义了这些UserDetails表属性。感谢您在L2S中指出一个重要注意事项:我不知道我可以使用表“UserDetails”作为对象。在实例化UserDetails之后,我能够分配新创建的用户详细信息并将其存储在我的sql中。感谢@sgmoore,我找到了这个解决方案,您也及时发布了它,因此也给了您分数:)
UserDetail u = new UserDetail();
u.username = TextBox1.Text;
u.password = TextBox2.Text;
TrackToolDataContext data = new TrackToolDataContext();
data.UserDetails.InsertOnSubmit(u);
data.SubmitChanges();