我是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.Identity
至DatabaseGeneratedOption.None
问题已经解决。
但是,此解决方案似乎无法正常运行。 插入列的值始终相同。这不是唯一的。
有了EF核心,一切都变得很简单,我不需要DatabaseGenerated
,只需遵循惯例即可。但是使用EF6,我陷入了困境。我想要的是Id字段必须唯一,并在每次插入数据库时增加。
有人可以帮我吗?
答案 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模型将数据库配置为良好状态。