0

我有一张表,其中有一个名为 ID_client 的属性,其中是主键。我必须从该属性中搜索最大值并执行 +1 以分配给新客户端。我有以下代码..

public int IDuser()
    {

        MembershipUserCollection iduser = Membership.GetAllUsers();

        foreach (MembershipUser member in iduser)
        {

            UserEntity entity = new UserEntity();
            entity.Username = member.UserName;
            entity.Roles = "Users";
            entity.Email = member.Email;
            for (int i = 1; i <=iduser.Count; i++)
            {
                entity.ID_client = i;
            }
            _entities.Add(entity);

        }

        int maxID = _entities.Max(x => x.ID_client) +1;

        return maxID;

    }

例如,如果我创建四个用户都可以,1、2、3 和 4。但是如果我删除第三个用户,我有 1、2 和 4 作为 ID_client,而下一个新用户,我想分配 5,但是这个函数返回我 4,而不是 5。就像函数做计数 + 1 而不是最大值 +1。

有人能帮我吗?

谢谢。

4

4 回答 4

3

您的代码在所有实体上重置 ID_client。因此,如果您删除一个用户,剩下的用户将 ID_client 设置为 1、2、3 或 4。因此 List.Max() 正确返回 4

于 2012-05-12T15:37:18.037 回答
2

您为方法命名的名称并不反映该方法应该做什么。给它一个会说话的名字。我看不到内部循环应该做什么。算了吧。在添加新记录之前获取最大 id。也许你想要这样的东西

public int CopyMembershipUsersToUserEntities()
{
    int lastID = _entities.Max(x => x.ID_client); 
    foreach (MembershipUser member in Membership.GetAllUsers()) 
    { 
        UserEntity entity = new UserEntity(); 
        entity.Username = member.UserName; 
        entity.Roles = "Users"; 
        entity.Email = member.Email; 
        entity.ID_client = ++lastID; 
        _entities.Add(entity); 
    } 
    return lastID; 
} 

正如其他人已经说过的,您还可以使用自动增量列。这在多用户环境中更安全。

于 2012-05-12T16:26:09.977 回答
1

在数据库级别启用字段“ID”的自动递增 - 所有这些代码都是多余的。

于 2012-05-12T15:31:02.867 回答
0

很奇怪,但我在这里解决了我的错误..

在存储membershipUser之前,我将它存储在一个列表中..

            uentity.Username = username;
            for(int i=1;i<1000;i++) 
            {
                uentity.ID_client = i;
            }
            _entities.Add(uentity);

然后创建一个membershipUser..

      userDataSource.Insert(new UserEntity(
      GetPartitionKeyFromUsername(username).ToString(),
      String.Empty)
            {
                Username = username,
                Password = EncodePassword(password),
                CreationDate = DateTime.Now,
                IsDeleted = DefaultValues.IsDeleted,
                IsLockedOut = DefaultValues.IsLockedOut,
                IsApproved = DefaultValues.IsApproved,
                ApplicationName = applicationName,
                Email = email,
                PasswordQuestion = passwordQuestion,
                PasswordAnswer = passwordAnswer,
                Gender = DefaultValues.Gender,
                LastProfileUpdatedDate = DateTime.Now,
                LastActivityDate = DateTime.Now,
                LastPasswordChangedDate = DateTime.Now,
                LastLoginDate = new DateTime(1970, 1, 1),
                LastLockedOutDate = new DateTime(1970, 1, 1),
                FailedPasswordAttemptWindowStart = new DateTime(1970, 1, 1),
                FailedPasswordAnswerAttemptWindowStart = new DateTime(1970, 1, 1),
                Birthday = new DateTime(1970, 1, 1),
                Roles = Roles(username),
                ID_client = IDuser(username)
            });

以及始终给我一个自动增量 ID 的方法,因为如果我删除会员用户,我不会从列表中删除..

    public int IDuser(string username)
    {

        int lastID;

        if (username=="Admin")
        {
            lastID=1;

        }

        else
        {

            lastID = _entities.Count();
        }

        return lastID;
    }

但我有一个答案,我用

  lastID = _entities.Count();

代替

  lastID = _entities.Max(x => x.ID_client)

因为第二个用户的 _entities.Max 给了我 999,而不是数字 2。它给了我剩余容量,而不是 ID_client(2) 的最大值。

谁能告诉我为什么会这样?

谢谢。

于 2012-05-15T08:20:54.060 回答