Azure

2017-02-17 6 views
0

ASPで発行された場合のPRIMARY KEY制約の違反特定のIDのPRIMARY KEY制約の違反。 (私はコード内にIDをランダムに生成しますが、IDはデータベースには存在しません)。Azure

ローカルマシン(同じAzureホストデータベース)でこのコードをデバッグすると、すべて正常に動作します。 Azureでコードを公開すると、エラーが発生します。奇妙なことは、エラーによってもたらされたランダムIDが私のデータベースに存在しないということです。

コード(私は新しいID &新しい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

SQL ServerのテーブルにPK列はどのように定義されていますか? – Sparrow

+0

'generateUniqueMedicationID'はどのように見えますか?なぜ標準のC#命名規則に従っていないのですか? – mason

+0

'Primary Key'を' Identity(1,1) 'に設定すると、テーブルに行が追加されるたびに自動的にインクリメントされます。 –

答えて

-1

C# 'ランダム' メソッド、ではありません真の乱数ジェネレータ。マイクロソフトでは、「擬似ランダム番号ジェネレータ」と言います。

このMSDNの記事[https://msdn.microsoft.com/en-us/library/system.random(v=vs.110).aspx]は言う:

擬似乱数が数字の有限 セットから等しい確率で選択されています。選ばれた数字は、次のような1ランダムなパスワードを作成するに適しています 、 を使用し、

は、暗号的に安全な乱数を生成するには.....、 数学的アルゴリズムは、それらを選択するために使用されているため、完全にランダムではありませんRNGCryptoServiceProviderクラス、または System.Security.Cryptography.RandomNumberGeneratorからクラスを派生させます。

簡単に言えば、数字は一定の間隔の後に繰り返されます。

SQLサーバ2012(またはそれ以上)を使用している場合、非順次ID値を持つ最も良い方法は、ID列を変更してGUIDを生成するuniqueidentifier型を使用することです。 C#コードではなく、値を作成して割り当てます。

+0

これははるかに優れた優雅なソリューションです。 今後の参照用に 私の問題は次のように解決することもできます: 1)ループ外でランダムを初期化する - または - 2)ループ内でsaveChanges()を呼び出す(効率的でない) – ArneDEPR

関連する問題