You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 04:54:25