C#中使用Bogus生成每千条同update_time值的假数据如何实现
实现方案
你当前的写法存在两个问题:
- 每次生成
Document实例时都会重新调用DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()获取时间,导致每条数据的update_time都不一致 - 代码语法存在错误:
RuleFor的委托内多了多余的分号,且时间戳返回值为long类型,需要转字符串匹配你定义的Document模型字段类型
最简实现(推荐)
分三次生成每批1000条数据,每批生成前提前固定好时间戳,最后合并结果即可:
private static IReadOnlyCollection<Document> GetDocumentsToInsert() { var result = new List<Document>(); // 分3批生成,每批1000条 for (int i = 0; i < 3; i++) { // 每批生成前固定时间戳 var batchTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds().ToString(); var batchDocuments = new Bogus.Faker<Document>() .StrictMode(true) .RuleFor(o => o.id, f => Guid.NewGuid().ToString()) .RuleFor(o => o.update_time, f => batchTime) .Generate(1000); result.AddRange(batchDocuments); // 如果需要不同批次的时间有明显间隔,可以在这里加等待逻辑,比如 Thread.Sleep(10); } return result.AsReadOnly(); } public class Document { public string update_time { get; set; } public string id { get; set; } }
单次生成实现
如果你不想分批次,也可以用Bogus自带的带索引的RuleFor重载,一次性生成3000条数据,按索引分组分配时间戳:
private static IReadOnlyCollection<Document> GetDocumentsToInsert() { // 提前生成3个时间戳,对应3组数据 var timeStamps = Enumerable.Range(0,3) .Select(_ => DateTimeOffset.UtcNow.ToUnixTimeMilliseconds().ToString()) .ToArray(); return new Bogus.Faker<Document>() .StrictMode(true) .RuleFor(o => o.id, f => Guid.NewGuid().ToString()) // 第二个参数index为当前生成的条目索引,从0开始 .RuleFor(o => o.update_time, (f, index) => timeStamps[index / 1000]) .Generate(3000); } public class Document { public string update_time { get; set; } public string id { get; set; } }
内容的提问来源于stack exchange,提问作者Mehul Parmar
相关产品推荐
相关产品推荐

