【问题标题】:Adding an identity field using code first Entity Framework使用代码优先实体框架添加标识字段
【发布时间】:2014-12-24 07:18:23
【问题描述】:

这是我在 MVC 项目中使用的模型类 Employee

public class Employee
{
        [Required]
        public string Name { get; set; }

        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int EmployeeID { get; set; }

        [DataType(DataType.EmailAddress)]
        public string Email { get; set; }

        public int SkillID { get; set; }

        [Display(Name="Employee Skill")]
        public Skill EmployeeSkill { get; set; }

        public virtual List<Skill> EmployeeSkills { get; set; }

}

如您所见,我已将[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 属性添加到EmployeeID 属性。但是,当我尝试插入而不指定 EmployeeID 作为输入值时,我收到以下错误...

无法将值 NULL 插入到列“EmployeeID”、表“MVCTheRightWayContext-20141028005000.dbo.Employees”中;列不允许空值。插入失败。 声明已终止。

【问题讨论】:

    标签: code-first auto-increment


    【解决方案1】:

    你要Add [Key]注解:

    public class Employee
    {
        [Required]
        public string Name { get; set; }
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int EmployeeID { get; set; }
    
        [DataType(DataType.EmailAddress)]
        public string Email { get; set; }
    
        public int SkillID { get; set; }
    
        [Display(Name="Employee Skill")]
        public Skill EmployeeSkill { get; set; }
    
        public virtual List<Skill> EmployeeSkills { get; set; }
    
    }
    

    【讨论】:

      【解决方案2】:

      在您的代码中执行此操作,您的问题将得到解决

      protected override void OnModelCreating(ModelBuilder modelBuilder)
      {
          modelBuilder.Entity<Employee>(entity =>
              {                       
                  entity.Property(e => e.EmployeeID )
                  .ValueGeneratedOnAdd();
                   entity.HasKey(x => x.EmployeeID );
              
              });
      }
      

      【讨论】:

        【解决方案3】:

        如果有“更智能”的方法可以做到这一点,请对此答案发表评论。

        我发现我无法将上面的两个注释(Key 和 DatabaseGeneratedOption.Identity)应用到已经存在的现有字段。

        首先,我需要通过删除实体模型来删除 SQL 中的表,然后让实体框架在 SQL 中重新创建表,以便将我的字段标记为 PK 并设置身份规范。

        希望这可以为某人节省几个小时的时间。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-02-25
          • 1970-01-01
          • 1970-01-01
          • 2017-09-01
          • 2014-05-23
          • 1970-01-01
          • 2018-07-07
          • 1970-01-01
          相关资源
          最近更新 更多