foreach (var tcitem in tclist) {
//当 tclist 中有多条数据时,这段用来生成code的代码,会出现重复code。 tcitem.order.OrderCode = "TC" + DateTime.Now.ToString("yyyyMMddHHmmss") + new Random().Next(100, 999);foreach (var tcitemdetail in tcitem.detail) { tcitemdetail.OrderCode = tcitem.order.OrderCode;//明细 } }
代码如上,遇到的问题是,当tclist有多条时,循环生成code 并赋值给对应的明细,执行时发现生成的code是重复的。
例如:我有两条订单,一个订单有两条订单明细。生成订单编号插入到数据库中会出现所生成的订单编号都一样的情况。
但是我打断点跟进去的时候却不会。
上面的代码并没有在事务中执行。
请问为什么会出现这样的问题?
下面是数据
红框中的两个相同的订单编号应该是不同的。
Random是伪随机,你循环速度太快而每次都是新的random实例导致很容易得出相同结果(时间种子相同),把random移到循环外则在每次获取随机数时种子都会发生变化致使得到的数字更为随机些。
yyyyMMddHHmmss加到毫秒就不会了,因为一秒类还是可以执行好多次的
建议把new Random().Next(100, 999)
放到循环外面降低生成重复随机数的可能
var rd = new Random();
// 循环内部直接调用
rd.Next(100, 999)
这个是所有入门课程都会教的..随机数对象要放在循环外面..