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

使用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”报错:

    1. 确认修改实体配置后已执行EF迁移命令更新数据库表结构,避免表字段和实体属性不匹配。
    2. 补充关联实体的外键配置,避免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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 21:18:02