在Azure上发布时违反PRIMARY KEY约束

时间:2017-02-17 16:26:00

标签: c# random primary-key

ASP会对特定ID产生违反PRIMARY KEY约束。 (我在代码中随机生成ID,同时检查它们在数据库中是否已存在)。

当我在本地计算机上调试此代码(使用相同的Azure托管数据库)时,一切正常。当我在Azure上发布我的代码时,我得到了错误。奇怪的是,由错误产生的随机ID在我的数据库中不存在。

代码(我使用新的id& new 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;
    }

1 个答案:

答案 0 :(得分:-1)

C#&#39;随机&#39;方法,不是一个真正的随机数发生器。正如微软所说,它是一个&#34; 伪随机数字生成器&#34;。

此MSDN文章[https://msdn.microsoft.com/en-us/library/system.random(v=vs.110).aspx]说:

  

从有限的概率中选择具有相等概率的伪随机数   一组数字。所选数字并非完全随机,因为a   数学算法用于选择它们,.....

     

生成加密安全随机数,例如一个   这适用于创建随机密码,请使用   RNGCryptoServiceProvider类或派生类   System.Security.Cryptography.RandomNumberGenerator。

简单来说,数字会在一定间隔后重复出现。

如果您使用SQL Server 2012(或更高版本),拥有非顺序ID值的最佳方法是更改​​ID列并使用uniqueidentifier类型,该类型会生成GUID,您应该让数据库引擎创建并分配值,而不是您的C#代码。