用Asp.Net Core+EF Core建立一个测试项目过程中,使用DbInitializaer.cs进行数据库表的初始化工作,当项目测试运行时执行到context.实体名.Add()时,提示错误信息:
The 'UserStatusID' on entity type 'UserStatus' does not have a value set and no value generator is available for properties of type 'Byte'. Either set a value for the property before adding the entity or configure a value generator for properties of type 'Byte'.
经过检查,各处的类型设置没有问题,检索网上的信息 Linq To EF 使用小知识(添加记录后获取添加的自增ID和叫“ID”的列不是自增列不让插入的问题) ,在这篇文章中的到启示,最终解决了问题。
留作记录,具体如下:
model模型定义:
public class UserStatus { [DatabaseGenerated(DatabaseGeneratedOption.None)]public byte UserStatusID { get; set; } [Required]public string Discription { get; set; } }
DbInitializer.cs中的初始化代码
if (!context.UserStatuses.Any()) { var userStatus = new UserStatus[] { new UserStatus {UserStatusID=0,Discription="在岗" }, new UserStatus {UserStatusID=1,Discription="调走" }, new UserStatus {UserStatusID=2,Discription="退休" }, }; foreach (var u in userStatus) { context.UserStatuses.Add(u); } context.SaveChanges(); }
执行到高亮的context.UserStatuses.Add(u)时,就出现了上面的错误。
后来,修改了Data文件夹中的***Context.cs文件中的OnMouldCreating,增加高亮部分,初始化成功,在数据库中查到了正确的初始数据。
protected override void OnModelCreating(ModelBuilder builder) { builder.Entity<UserAuthority>().ToTable("Authority"); builder.Entity<UserAuthority>().Property(p => p.UserAuthorityID).ValueGeneratedNever(); //其他。。。。。。 }
思考:
包括www.asp.net上一些教程给出的例子,模型的主键均没有定义[DatabaseGenerated(DatabaseGeneratedOption.None)]属性,在DbInitializer.cs初始数据定义时没有什么特别的要求。但是一旦定义了该属性,就需要在上下文定义类中OnModelCreating()中,一并给出该信息。
这个问题有些奇怪,非得在两处都进行这样的声明方可,不是不项目启动的时候文件执行顺序的问题?