2017-02-17 3 views
0

ASP дает Нарушение ограничения PRIMARY KEY по конкретному идентификатору. (Я произвольно генерирую ID в коде, проверяя, что они еще не существуют в базе данных).Нарушение ограничения PRIMARY KEY при публикации на Azure

Когда я отлаживаю этот код на своем локальном компьютере (с той же базой данных Azure), все работает нормально. Когда я публикую свой код на Azure, я получаю ошибку. Странно то, что случайный идентификатор, полученный ошибкой, НЕ существует в моей базе данных.

кода (скопировать список лекарств с новым идентификатором & новый schemeID):

метод
 List<medication> l = db.medication.AsNoTracking().Where(x => x.scheme_ID == schemeID).ToList(); 
      foreach (medication m in l) { 
       int id = generateUniqueMedicationID(); 
       m.ID = id; 
       m.scheme_ID = newSchemeID; 
       db.medication.Add(m); 
      } 
     db.SaveChanges(); 

generateUniqueMedicationID():

private int generateUniqueMedicationID() 
    { 
     bool stop = true; 
     int id = -1; 
     while (stop) 
     { 
      Random r = new Random(); 
      id = r.Next(100000000, 1000000000); 
      if (!db.medication.Any(o => o.ID == id)) stop = false; 
     } 
     return id; 
    } 
+0

Как определяется столбец PK в таблице на SQL-сервере? – Sparrow

+0

Что означает 'generateUniqueMedicationID'? Почему вы не следуете стандартным соглашениям об именах C#? – mason

+0

Установите таблицу 'Первичный ключ' в' Identity (1,1) ', чтобы он автоматически увеличивался каждый раз, когда строка добавляется в таблицу. –

ответ

-1

C# метод 'Random', не истинный генератор случайных чисел. Как полагает Microsoft, это «генератор чисел с псевдослучайным числом».

В этой статье MSDN [https://msdn.microsoft.com/en-us/library/system.random(v=vs.110).aspx] говорит:

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

Для генерации криптографически защищенного случайного числа, например, один , который подходит для создания случайного пароля, используйте RNGCryptoServiceProvider или получить класс из System.Security.Cryptography.RandomNumberGenerator.

Простыми словами цифры повторяются через определенный интервал.

Лучший способ иметь несекретные значения ID, если вы используете SQL Server 2012 (или выше), заключается в изменении столбца идентификатора и использовании типа uniqueidentifier, который генерирует GUID, и вы должны позволить вашему механизму DB создайте и присвойте значение, а не код C#.

+0

Это, безусловно, лучшее и изящное решение. Для справок в будущем . Моя проблема также может быть решена с помощью: 1) инициализация случайного вне цикла - или - 2) вызов saveChanges() внутри цикла (неэффективен вообще) – ArneDEPR

Смежные вопросы