如何在ASP.NET中通过LINQ向带默认序列的非空列传值?
解决方案汇总
方案1:标记实体列为数据库生成值(最优,无需修改表结构/手动处理序列)
这是优先级最高的适配方案,完全满足你的需求:
- 如果你使用LINQ to SQL的DBML设计器:打开对应表的映射设计界面,选中目标列,在属性面板将自动生成值设为
True,更新检查设为Never即可。 - 如果你手动编写实体类:给对应列的属性添加
IsDbGenerated参数,示例如下:
[Column(Storage = "_YourSeqColumn", DbType = "BigInt NOT NULL", IsDbGenerated = true, UpdateCheck = UpdateCheck.Never)] public long YourSeqColumn { get; set; }
配置完成后,插入数据时LINQ不会在INSERT语句中拼接该列,数据库会自动应用NEXT VALUE FOR SeqDefa的默认值规则,完全不需要你传值,也不会触发非空校验报错。
方案2:通过LINQ手动查询序列的下一个值
如果你的业务逻辑需要在插入数据前就拿到该序列值做其他处理,可以直接通过LINQ执行原生SQL查询获取序列值,再赋值给对应列即可:
// 假设db是你的LINQ DataContext实例 long nextSequenceValue = db.ExecuteQuery<long>("SELECT NEXT VALUE FOR SeqDefa;").First(); // 赋值给实体属性 yourEntity.YourSeqColumn = nextSequenceValue;
这个方案不需要修改任何映射配置,也符合非空列的赋值要求,插入时不会报错。
注意事项
不要尝试给非空列传null触发默认值的逻辑:实体类中对应非空列的属性默认是值类型,本身不支持赋值null,即便强制改可空类型,LINQ的映射校验也会在提交到数据库前直接抛出异常,根本无法触发数据库侧的默认值规则。
内容的提问来源于stack exchange,提问作者Maxi Albert
相关产品推荐
相关产品推荐

