无法使用数据注释(EF6)生成ID

时间:2019-09-27 19:16:16

标签: asp.net asp.net-mvc entity-framework asp.net-mvc-5 entity-framework-6

我是EF6和Asp.net MVC5的新手。 尝试使用代码优先方法创建实体时,存在自动生成唯一ID的问题。

考虑这样的实体:

        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int PostId { get; set; }
        [Required]
        [MaxLength(100), MinLength(5)]
        public string Title { get; set; }
        public string Content { get; set; }
        public string Thumbnail { get; set; }
        public string Description { get; set; }
        public DateTime DateCreated { get; set; }

当我将[DatabaseGenerated(DatabaseGeneratedOption.Identity)]放在PostId上或什至将其删除时。我总是遇到这样的异常错误:

  

“无法将值NULL插入列'PostId'”。   “列不允许为空。 INSERT失败。

我不知道为什么EF6总是尝试向ID列插入空值。

然后,我找到了解决方案。 我改变了

DatabaseGeneratedOption.IdentityDatabaseGeneratedOption.None

问题已经解决。

但是,此解决方案似乎无法正常运行。 插入列的值始终相同。这不是唯一的。

有了EF核心,一切都变得很简单,我不需要DatabaseGenerated,只需遵循惯例即可。但是使用EF6,我陷入了困境。我想要的是Id字段必须唯一,并在每次插入数据库时​​增加。

有人可以帮我吗?

2 个答案:

答案 0 :(得分:0)

我也是EF的新手,但是我只是创建了一个Id字段,它由SQL Server自动插入,例如当前项目中的此模型。添加新行时,Id字段将按预期填充:

public class BlogPosts
{
    public int Id { get; set; }
    [Required]
    public string Title { get; set; }
    [Required]
    public string ShortPost { get; set; }
    [Required]
    public string Post { get; set; }
    [Required]
    public string Tags { get; set; }
    [Required]
    public DateTime Updated { get; set; }
}

答案 1 :(得分:0)

DatabaseGeneratedOption.Identity应用于密钥属性时,您正在告诉EF数据库将生成身份。从错误中得知您的数据库PostId列未配置为身份或主键。

如果您在数据库中手动创建了表和列,则应确保配置至少兼容,或者应使用迁移来确保针对EF模型将数据库配置为良好状态。