EFCore之CodeFirst更新数据库

EFCore之CodeFirst更新数据库

前言

今天小区由封控区变为管控区了,但是疫情还很严重,几天又有2W阳性,目前为止上海都有50W阳性病例了,好了,不多少说了,言归正传,在上节EFCoreCodeFirst模式”了解了CodeFirst,这节主要讲述CodeFirst更新数据库,设置主键、外键和字符串长度。

环境

l Win10

l VS2022

l .NET5.0

 

项目实践

EFCoreCodeFirst模式”的代码基础上继续改造。增加一对多的关系,项目如下:

 

 

 

 

四个包说明如下:

1Microsoft.EntityFrameworkCore                  ef core的核心包

2Microsoft.EntityFrameworkCore.Design            延迟加载实现包

3Microsoft.EntityFrameworkCore.Tools              工具扩展包

4Microsoft.EntityFrameworkCore.SqlServer sqlserver   数据库驱动包

DB项目

Step1: 修改用户Sys_User

实体类中用注解的方式进行了相关映射,

 

 


Table  对应数据库表名

l Key   主键

l DatabaseGenerated.Identity  数据库自动增长列

l Required  非空

 

[Table("Sys_User")]

    public class Sys_User

    {

        [Key]

        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]

        public int Id { get; set; }

        /// <summary>

        /// 用户名

        /// </summary>

        [MaxLength(50), Required]

        public string Name { get; set; }

        /// <summary>

        /// 密码,长度50

        /// </summary>

        [MaxLength(50), Required]

        public string Password { get; set; }

        /// <summary>

        /// 手机号码

        /// </summary>

        public string Mobile { get; set; }

        public virtual ICollection<Sys_UserInfoDetails> UserInfoDetails { get; set; }

    }

 

 

Step2: 添加用户详情Sys_UserInfoDetailsr

增加一对多关系,只需要增加:

 public virtual ICollection<Sys_UserInfoDetails> UserInfoDetails { get; set; }

[Table("Sys_User")]

    public class Sys_User

    {

        [Key]

        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]

        public int Id { get; set; }

        /// <summary>

        /// 用户名

        /// </summary>

        [MaxLength(50), Required]

        public string Name { get; set; }

        /// <summary>

        /// 密码

        /// </summary>

        [MaxLength(50), Required]

        public string Password { get; set; }

        /// <summary>

        /// 手机号码

        /// </summary>

        public string Mobile { get; set; }

        public virtual ICollection<Sys_UserInfoDetails> UserInfoDetails { get; set; }

    }

 

 

Step3:修改数据库上下文MyDbContext

 

增加集合和映射关系

public class MyDbContext : DbContext

    {

        public MyDbContext(DbContextOptions<MyDbContext> options)

            : base(options)

        {

        }

        /// <summary>

        /// 重写父类的方法 用于连接数据库

        /// </summary>

        /// <param name="optionsBuilder"></param>

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)

        {

            if (!optionsBuilder.IsConfigured)

            {

                optionsBuilder.UseSqlServer("Data Source=.;database=CapDb;uid=sa;pwd=sa123456");

            }

        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)

        {

            base.OnModelCreating(modelBuilder);

            modelBuilder.Entity<Sys_User>(entity => {

                entity.Property(t => t.Password).HasDefaultValue("123456");

            });

            modelBuilder.Entity<Sys_UserInfoDetails>(entity => {

                entity.HasOne(t => t.Userinfo)

                .WithMany(t => t.UserInfoDetails)

                .HasForeignKey(t => t.UserId); //外键

            });

 

        }

        public DbSet<Sys_User> Users { get; set; }

        public DbSet<Sys_UserInfoDetails> UserInfoDetails { get; set; }

        

 }

 

 

迁移数据库

在程序包管理器控制台中输入迁移命令:

add-migration AddUserDetails

update-database AddUserDetails

 

执行完之后项目会多一个Migrations文件夹,这个是项目的迁移记录。

 

 

 

结果

更新数据库,生成了外键、字段长度,必须等。

 

 

 

 

 

 

 

总结

如果Migration还没有应用到数据库可以直接回退,使用Remove-Migration移除迁移。如果已经应用到数据库但是没有重要数据,可以直接删除数据库以及项目中的Migrations文件夹,然后按一开始的创建重新走一遍就好了。

 

鸣谢

https://blog.csdn.net/zhang_adrian/article/details/100114115

源码

https://github.com/yandaniugithub/CAP

最后,欢迎各位大佬们评论指正

QQ讨论群:610129902

版权所有,转载请注明出处:

https://www.cnblogs.com/yakniu/p/16205068.html

 

posted @ 2022-04-30 12:24  春光牛牛  阅读(1119)  评论(0编辑  收藏  举报