0

主キーであるID_clientという1つのプロパティを持つテーブルがあります。このプロパティから最大値を検索し、+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;

    }

たとえば、4 人のユーザーを作成する場合は、1、2、3、4 で問題ありません。しかし、3 番目のユーザーを削除すると、ID_client として 1、2、4 があり、次の新しいユーザーには 5 を割り当てたいと考えています。しかし、この関数は 5 ではなく 4 を返します。関数が最大値 +1 の代わりにカウント + 1 を実行するようです。

誰かが私を助けることができますか?

ありがとう。

4

4 に答える 4

3

コードは、すべてのエンティティで ID_client をリセットします。したがって、1 人のユーザーを削除すると、残ったユーザーの 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

非常に奇妙ですが、ここで私の間違いを解決しました..

メンバーシップユーザーを保存する前に、リストに保存します..

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

そして、メンバーシップユーザーを削除してもリストから削除しないため、常に1つの自動インクリメント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)

2 番目のユーザーの _entities.Max は、2 ではなく 999 を示しているためです。これは、ID_client(2) の最大値ではなく、残りの容量を示しているためです。

誰かが私になぜこれが起こるのか教えてもらえますか?

ありがとう。

于 2012-05-15T08:20:54.060 に答える