为何Telerik ORM会使SQL Server数据库列值每次递增10?
你提到SQL Server中Customer.Obj表的Object_id主键每次递增10,且该列需手动填写,Telerik ORM映射配置中无相关设置,以下是该逻辑可能的控制位置:
应用层业务/数据访问代码
大概率是在创建CustomerObj实体的业务逻辑里硬编码了Id生成规则。比如在服务类或Repository的新增方法中,先查询当前表中最大的Object_id值,再给新实体的Id赋值为maxId + 10。检查项目中处理新增客户对象的代码,是否存在类似:var latestId = dbContext.CustomerObjs.Max(o => o.Id); var newCustomer = new CustomerObj { Id = latestId + 10, ... }; dbContext.CustomerObjs.Add(newCustomer);这类逻辑。
Telerik ORM的全局配置或拦截器
虽然当前的MappingConfiguration中没有相关设置,但Telerik OpenAccess支持通过实体拦截器(实现IInterceptor接口)在实体保存前自动赋值。检查项目中是否有继承IInterceptor的类,在OnSave方法中处理Id的生成;另外也可能存在全局的序列生成配置,针对该实体的Id字段做自定义递增规则。数据库触发器
即使你认为不是SQL Server处理,也需排除表上的触发器逻辑。比如INSTEAD OF INSERT触发器会在插入操作执行前,自动计算并设置Object_id的值(取当前最大值+10)。可以通过以下SQL查询表的触发器:SELECT name, definition FROM sys.triggers JOIN sys.sql_modules ON triggers.object_id = sql_modules.object_id WHERE parent_id = OBJECT_ID('Customer.Obj')或者在SSMS中找到该表,右键查看触发器列表。
前端/UI层预设逻辑
如果手动填写时输入框会自动填充递增后的值,可能是前端在加载新增表单时,调用后端接口获取下一个Id值(比如接口返回当前最大Id+10),并自动填入输入框,让用户误以为是手动填写。检查前端新增页面的JS代码,是否存在请求后端获取Id并预设的逻辑。
内容的提问来源于stack exchange,提问作者Dominique

