DbInitializer.cs初始化过程中context.entityName.Add()遇到的类型不匹配错误

时间:2023-03-09 17:46:58
DbInitializer.cs初始化过程中context.entityName.Add()遇到的类型不匹配错误

用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=,Discription="在岗" },
new UserStatus {UserStatusID=,Discription="调走" },
new UserStatus {UserStatusID=,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()中,一并给出该信息。

这个问题有些奇怪,非得在两处都进行这样的声明方可,不是不项目启动的时候文件执行顺序的问题?