【问题标题】:Duplicate users added to database重复用户添加到数据库
【发布时间】:2013-06-08 00:58:24
【问题描述】:

我尝试向我的数据库添加一个新值。 UserPasswordRePassword 必须具有相同的值,并且具有 UserName 的用户不得已存在于数据库中。

  public User NewUser(int HotelID, string UserName, string UserPassword, string RePassword, string FullName, string Email, bool Active, bool MasterUser)
    {
        User user = new User();
        user.HotelID = HotelID;
        user.UserName = UserName;
        user.UserPassword = UserPassword;
        user.FullName = FullName;
        user.Email = Email;
        user.IsActiveq = Active;
        user.IsMaster = MasterUser;

        var cekUser = (from c in _UserRepository.All()
                       where c.HotelID == HotelID
                       select c.UserName).ToList();
        if (UserPassword == RePassword)
        {
            foreach (string cek in cekUser)
            {
                var x = cek;
                if (UserName != x)
                {
                    _UserRepository.Add(user);
                }
            }
        }

        _UserRepository.CommitChanges();

        return user;

    }

每次我运行我的代码时,都会向数据库中添加一个新行,尽管具有所提供用户名的用户已经存在于数据库中。

为什么会这样?我的代码哪一部分错了?

【问题讨论】:

  • 那个循环的目的是什么?看起来您将新用户添加到存储库的次数与拥有用户的次数一样多。
  • 我尝试检查,我的值是否存在于数据库中,或者循环中不存在
  • 看起来每次UserNamex 不匹配时,您都在将用户添加到您的数据库中。为什么不检查您的字符串列表中的 string 值呢? `bool ListContainsString = listOfStrings.Any(myString.Contains);'.
  • 你能给我举个例子吗?
  • 检查这个线程,这是一个众所周知的用例:stackoverflow.com/questions/500925/…

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-4


【解决方案1】:

我认为你的代码应该是这样的:

if (UserPassword == RePassword)
{
    // Also I thinks you should finish whether user existed logic in database
    // but for now, let's follow your original logic
    var existedUsers = (from c in _UserRepository.All()
                       where c.HotelID == HotelID
                       select c.UserName).ToList();

    if (!existedUsers.Any(u => u == UserName))
    {
        _UserRepository.Add(user);
        _UserRepository.CommitChanges();
    }   
}

【讨论】:

    【解决方案2】:

    你的逻辑错了。如果给定酒店中有多个用户,您的代码将为所有名称与 UserName 不同的用户添加更多用户。

    bool found = false;
    foreach(string cek in cekUser)
    {
      if ( UserName == cek)
      {
        found = true;
        break;
      }
    }
    if (!found)
       _UserRepository.Add(user);
    

    【讨论】:

    • 你能解释一下,我应该使用什么逻辑
    【解决方案3】:

    只是提供一个替代想法。

    如果您有权访问数据库,最好的方法是将Username 字段设为唯一。这样,即使您的代码错误,重复插入也会失败。然后你在你的存储库中优雅地捕获失败,鲍勃是你的叔叔。

    【讨论】:

      猜你喜欢
      • 2020-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-14
      相关资源
      最近更新 更多