.NET Core 6.0:如何将主键值加1后插入数据库?
改造泛型仓储实现主键自增插入
你当前的GetMaxPK仅负责获取主键最大值,要实现“取最大值+1作为新主键并插入记录”,可以直接新增一个整合逻辑的泛型方法,具体实现方案如下:
1. 新增泛型插入方法
在泛型仓储中添加InsertWithGeneratedPK方法,整合主键生成与插入逻辑:
using System.Reflection; public async Task<T> InsertWithGeneratedPK(T entity, Expression<Func<T, int?>> columnSelector) { try { // 获取主键列当前最大值,无数据则取0 int maxNumber = await _context.Set<T>().MaxAsync(columnSelector) ?? 0; int newPk = maxNumber + 1; // 通过表达式树解析主键属性并赋值 var property = ((MemberExpression)columnSelector.Body).Member as PropertyInfo; property.SetValue(entity, newPk); // 插入实体并保存到数据库 _context.Set<T>().Add(entity); await _context.SaveChangesAsync(); return entity; } catch (Exception ex) { Log.Error(ex.Message); throw; // 可根据业务需求调整为返回null或错误标识 } }
2. 调用示例
针对Nr_Afspraak主键的场景,调用方式如下:
// 创建待插入的实体对象,无需手动赋值主键 var newAfspraak = new Afspraak { Naam = "测试预约", Datum = DateTime.Now // 其他属性按需赋值 }; // 调用仓储方法完成主键生成与插入 var insertedAfspraak = await InsertWithGeneratedPK(newAfspraak, afspraak => (int?)afspraak.Nr_Afspraak); // 插入后的实体已携带生成的主键 int generatedId = insertedAfspraak.Nr_Afspraak;
3. 重要注意事项
- 并发风险:这种手动生成主键的方式在多线程/多实例场景下易出现主键重复,因为“取最大值”和“插入”并非原子操作。如果业务允许,优先使用数据库自增主键(如SQL Server的
IDENTITY、MySQL的AUTO_INCREMENT),更安全高效。 - 表达式树兼容性:代码通过表达式树解析主键属性,确保泛型方法适配不同实体的主键列。
- 异常处理:示例中直接抛出异常,你可根据业务需求调整为返回
null或自定义错误状态。
内容的提问来源于stack exchange,提问作者user3552264
相关产品推荐
相关产品推荐

