Элемент C # GetAllUsers() уже добавлен. Ошибка ключа в словаре

#c# #asp.net-membership

#c# #asp.net-членство

Вопрос:

Я новичок в C #, использующий членство для обработки пользователей.

Я унаследовал код, который я не писал.

Код пытается получить всех пользователей, чтобы он мог отобразить все в таблице. Другой вариант, который он пытается сделать, это показать каждую букву в алфавите для фильтрации по букве. Вот код:

 private void Page_PreRender()
    {
        if (Alphalinks.Letter == "All")
        {
            Users.DataSource = Membership.GetAllUsers();
        }
        else
        {
            Users.DataSource = Membership.FindUsersByName(Alphalinks.Letter   "%");
        }
        Users.DataBind();
    }
 

Ошибка, с которой я столкнулся, находится в этой строке:

 Users.DataSource = Membership.GetAllUsers();
 

Когда я запускаю страницу, она выдает ошибку:

Элемент уже добавлен. Ключ в словаре: ‘2309’ Добавляется ключ: ‘2309’.

Трассировка стека:

    System.Collections.Hashtable.Insert(Object key, Object nvalue, Boolean add)  14328157
   System.Web.Security.MembershipUserCollection.Add(MembershipUser user)  268
   System.Web.Providers.DefaultMembershipProvider.GetAllUsers(Int32 pageIndex, Int32 pageSize, Int32amp; totalRecords)  315
   System.Web.Security.Membership.GetAllUsers()  37
   ASP.admin_access_users_aspx.Page_PreRender() in x:xxxxxxxxPMAdminaccessusers.aspx:9
   System.EventHandler.Invoke(Object sender, EventArgs e)  0
   System.Web.UI.Control.OnPreRender(EventArgs e)  11725240
   System.Web.UI.Control.PreRenderRecursiveInternal()  132
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)  4005]
 

Я просмотрел аналогичную ситуацию в StackOverflow, и мне сказали, что это вызвано дублированием имен пользователей… обычно в нижнем регистре.

Моя проблема в том, что я не знаю, откуда это берется. У меня нет ‘2309’ в моих таблицах пользователей или членства.

Мое соединение по умолчанию в web.config: <add name="DefaultConnection" providerName="System.Data.SqlClient" connectionString="Data Source=xxxxxx;Initial Catalog=xxxPM;Persist Security Info=True;User ID=sa;Password=xxxx" />

Следующее в web.config указывает на это DefaultConnection:

 <profile defaultProvider="DefaultProfileProvider">
      <providers>
        <add name="DefaultProfileProvider" type="System.Web.Providers.DefaultProfileProvider, System.Web.Providers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" applicationName="/" />
      </providers>
    </profile>
    <membership defaultProvider="DefaultMembershipProvider">
      <providers>
        <add name="DefaultMembershipProvider" type="System.Web.Providers.DefaultMembershipProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" passwordFormat="Clear" applicationName="/" />
      </providers>
    </membership> 
    <roleManager enabled="true" defaultProvider="DefaultRoleProvider">
      <providers>
        <add connectionStringName="DefaultConnection" applicationName="/" name="DefaultRoleProvider" type="System.Web.Providers.DefaultRoleProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
      </providers>
    </roleManager> 
 

База данных SQL в этом соединении имеет таблицу пользователей и таблицу членства. Я выполнял подобные запросы для таблиц Users и Memberships:

 SELECT  COUNT(username) cnt,
      Lower(Username) as Username
  FROM [xxxxPMTest].[dbo].[Users]
  GROUP BY UserName
  HAVING COUNT(username) > 1
 

Чтобы убедиться, что у меня есть уникальные пользователи. Возвращено 0 записей.

Я не могу найти никаких дубликатов.

Я пробовал комментировать Пользователей.Источник данных = Членство.GetAllUsers(); и страница загрузится, показывая все буквы алфавита, разделенные для фильтрации. Нажатие на каждую букву правильно фильтрует пользователей, и ни на одной из страниц нет никаких ошибок (которые я ожидал бы обнаружить, если бы на самом деле была дублирующаяся запись). Я не могу понять, почему я получаю эту ошибку.

Что я делаю не так? Что я могу добавить, чтобы проверить, существует ли ключ уже в Членстве?Получите доступ к пользователям, прежде чем добавлять его к пользователям.Источник данных? Это вообще правильный подход?

— отредактированный SQL-запрос —

Комментарии:

1. Разве ваш sql-запрос не ошибочен? Разве вы не хотели бы убедиться, что count равен> 1?

2. Я думаю, вы должны выяснить, что такое «2309». Вероятно, дубликат первичного ключа, но это всего лишь предположение.

3. Вы не увидите дубликат со словарем. Словарь не позволит добавлять дубликат. Похоже, что в таблице UserName есть имя и идентификатор. Имя пользователя уже есть в таблице, и вы получаете исключение, когда имя уже существует. Какое имя вы добавляете? Вы проверили, есть ли это имя уже в таблице?

4. GROUP BY LOWER(UserName) Изменяет ли поведение?

5. HAVING COUNT(username) < 1 Как это вообще может быть правдой? Как это ЧИСЛО могло быть равно 0?