C# 使用LINQ向sql添加新用户

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;

我正在尝试Linq to SQL来访问我的SQL server。我有一个用户表,其中包含字段的uid、用户名和密码。我为我的dbcontext创建了linq到sql类

我可以使用我的login.aspx.cs中的登录屏幕连接到我的站点:

 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();