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=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()中,一并给出该信息。

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

  

posted @ 2016-10-17 14:32  jqdy  阅读(521)  评论(0)    收藏  举报