0

我正在将一名员工保存到 SQL 数据库中。我正在保存名字、姓氏、用户名和密码。我应该怎么做才能防止保存多个相同的用户名?

我试过这个:

    private void CreateEmployee()
    {
        using (var db = new TidrapportDBEntities())
        {
            var user = (from p
                       in db.Login
                        where p.username != null
                        select p).ToList();

            foreach (var vUser in user)
            {
                if (vUser.username == textBoxUsername.Text)
                {
                    labelSuccessFail.Visible = true;
                    labelSuccessFail.Text = "Accountname already exist.";

                    break;
                }
                else
                {
                    var userInfo = new Login();
                    var persInfo = new PersonalInformation();

                    persInfo.firstname = textBoxFirstname.Text;
                    persInfo.lastname = textBoxLastname.Text;

                    userInfo.username = textBoxUsername.Text;
                    userInfo.password = textBoxPassword.Text;
                    userInfo.employeeId = persInfo.employeeId;

                    db.Login.Add(userInfo);
                    db.PersonalInformation.Add(persInfo);
                    db.SaveChanges();

                    textBoxFirstname.Text = string.Empty;
                    textBoxLastname.Text = string.Empty;
                    textBoxUsername.Text = string.Empty;
                    textBoxPassword.Text = string.Empty;

                    labelSuccessFail.Visible = true;
                    labelSuccessFail.Text = "Successfully created account.";
                }
            }
        }            
    }

我可以尝试什么提示?

亲切的问候,克里斯蒂安

4

1 回答 1

0

您应该对用户名字段有一个唯一的约束。不确定您是在 EF 中先执行代码、先执行模型还是先执行 DB,但您应该能够通过谷歌搜索如何使用正确的方法在数据库中设置它。如果您尝试保存一个,这将引发异常,以确保您不能拥有多个。

您还可以使用 LINQ 语句将用户列表限制为您希望创建的用户名,然后您只需检查一个布尔值以查看是否返回了一行。这样你就不必阅读整个数据库表(你的“toList”正在做)。

在您的代码示例中,您将获取所有具有用户名的用户,然后循环它们,但是您的条件代码仅在第一个与您要保存的用户名匹配时才真正起作用,否则您将尝试第二次重新创建一个副本。因此,为了让您的代码正常工作,您可以尝试:

   private void CreateEmployee()
    {
        using (var db = new TidrapportDBEntities())
        {
            var user = (from p
                       in db.Login
                        where p.username != null
                        select p).ToList();

            bool found = false;
            foreach (var vUser in user)
            {
                if (vUser.username == textBoxUsername.Text)
                {
                    found = true;
                    labelSuccessFail.Visible = true;
                    labelSuccessFail.Text = "Accountname already exist.";

                    break;
                }
           }

           if(!found)     
           {
                    var userInfo = new Login();
                    var persInfo = new PersonalInformation();

                    persInfo.firstname = textBoxFirstname.Text;
                    persInfo.lastname = textBoxLastname.Text;

                    userInfo.username = textBoxUsername.Text;
                    userInfo.password = textBoxPassword.Text;
                    userInfo.employeeId = persInfo.employeeId;

                    db.Login.Add(userInfo);
                    db.PersonalInformation.Add(persInfo);
                    db.SaveChanges();
于 2013-11-10T22:35:45.967 回答