C#非数据库场景实例化类仅传Col1/Col2如何实现rowId自增
问题原因
[Key]、[DatabaseGenerated(DatabaseGeneratedOption.Identity)]是EF等ORM框架对接数据库时生效的特性,仅在数据写入数据库的环节触发ID生成,内存中直接实例化类时不会执行任何自增逻辑,完全不适用于无数据库的纯内存场景。
实现方案
通过类级别的静态共享计数器实现自增,静态变量归所有类实例共有,可全局维护递增序列,多线程场景下使用原子操作保证ID不重复。
改造后的模型代码
public class Class1 { // 全局共享计数器,所有实例共用同一份计数 private static int _rowIdSeed = 0; public int rowId { get; private set; } public string Col1 { get; set; } public string Col2 { get; set; } public Class1() { // 原子自增,单/多线程环境下均可保证ID连续不重复 rowId = Interlocked.Increment(ref _rowIdSeed); } /// <summary> /// 可选:重置计数器,需要新的列表从1开始编号时调用 /// </summary> /// <param name="startValue">重置后的起始计数,默认0,下一个生成的ID为1</param> public static void ResetIdSeed(int startValue = 0) { Interlocked.Exchange(ref _rowIdSeed, startValue); } }
使用方式
实例化时仅需赋值Col1、Col2,rowId会在构造函数中自动生成递增值:
// 如需新列表从1开始计数,可先调用重置方法 Class1.ResetIdSeed(); var dataList = new List<Class1> { new Class1{Col1 = "测试1", Col2 = "参数1"}, // rowId = 1 new Class1{Col1 = "测试2", Col2 = "参数2"}, // rowId = 2 new Class1{Col1 = "测试3", Col2 = "参数3"} // rowId = 3 };
补充说明
- 若确定只在单线程场景使用,可将自增逻辑简化为
rowId = ++_rowIdSeed;Interlocked是轻量原子操作,无额外性能开销,多线程场景下优先推荐使用 - 原代码中的数据库相关特性可直接删除,避免后续维护时产生误解
- 静态计数器的生命周期随应用程序域存在,若不手动重置,后续所有新实例的rowId会在之前的计数基础上继续递增
内容的提问来源于stack exchange,提问作者Ramu
相关产品推荐
相关产品推荐

