使用Entity Framework 6如何在ID列中保存自定义数值
EF Code First 手动赋值主键ID报错解决方案
使用Entity Framework Code First模式开发时,需要自定义Order表主键ID的生成规则(预期值为10001、10002、10003这类序列,而非默认的1、2、3自增),尝试手动给ID赋值时触发如下报错:
Can't insert null to table Orders.ID Insert fails
在ID属性上添加[DatabaseGenerated(DatabaseGeneratedOption.Identity)]配置后,又抛出新错误:
Invalid column name 'ID'(无效列名'ID')
相关业务实体代码如下:
public class Order { [Key] public int ID { get; set; } // I WANT THIS COLUMN SHOULD BE SAVED AS "10001,10002,10003" INSTEAD OF "1,2,3,4" public string CustomerID { get; set; } public string CustomerName { get; set; } public string CustomerEmail { get; set; } public virtual List<OrderItem> OrderItems { get; set; } public virtual List<OrderHistory> OrderHistory { get; set; } } public class OrderHistory { public int OrderID { get; set; } public int OrderStatus { get; set; } public string Note { get; set; } } public class OrderItem { public int OrderID { get; set; } [NotMapped] public string ProductName { get; set; } public int ProductID { get; set; } public virtual Product Product { get; set; } /// <summary> /// Item Price is in Order Item because we can have a scenerio where we might charge less or greater than the Product Price. /// </summary> public decimal ItemPrice { get; set; } public int Quantity { get; set; } }
解决步骤
- 调整主键配置:你需要手动给ID赋值的场景,不能使用
DatabaseGeneratedOption.Identity(该配置代表主键由数据库自增生成,EF插入数据时会忽略代码中给ID赋的值),要改为DatabaseGeneratedOption.None,明确告知EF主键值由代码层面生成,插入时会携带你赋的ID值写入数据库:
[Key] [DatabaseGenerated(DatabaseGeneratedOption.None)] public int ID { get; set; }
修复“无效列名ID”报错:
- 确认修改实体配置后已执行EF迁移命令更新数据库表结构,避免表字段和实体属性不匹配。
- 补充关联实体的外键配置,避免EF自动生成不符合预期的外键列:
给OrderHistory补充外键和导航属性:
public class OrderHistory { [ForeignKey(nameof(Order))] public int OrderID { get; set; } public int OrderStatus { get; set; } public string Note { get; set; } public virtual Order Order { get; set; } }按同样规则给OrderItem补充外键配置即可。
可选方案:如果你需要ID自动从10001开始递增,不需要手动赋值,可保留
DatabaseGeneratedOption.Identity配置,在数据库执行SQL命令设置自增种子:DBCC CHECKIDENT ('Orders', RESEED, 10000),之后插入的第一条数据ID就会是10001,后续自动递增。
内容的提问来源于stack exchange,提问作者Asaad
相关产品推荐
相关产品推荐

