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;
}
答案 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#代码。