5、vs2022_使用DB first创建数据库并使用Migration进行迁移
一、项目Web_DEMO添加数据上下文
1、创建数据库上下文
在Repository文件夹中添加DemoDbContext类,继承DbContext,DemoDbContext中包括包含了所有逻辑,比如与数据库交互、数据变化追踪等。添加引用:using Microsoft.EntityFrameworkCore;
将实体类Login添加到Dbset,添加引用:using Web_DEMO.Models;
当数据库创建完成后, EF 创建一系列数据表,表名默认和 DbSet 属性名相同。 集合的属性名通常采用复数形式。 例如,使用 Students,而不使用 Student,OnModelCreating方法,在 DbContext 中指定单数形式的表名称会覆盖默认行为。
using Microsoft.EntityFrameworkCore; using Web_DEMO.Models; namespace Web_DEMO.Repository { public class DemoDbContext: DbContext { /// <summary> /// 配置数据库连接 /// </summary> /// <param name="options"></param> public DemoDbContext(DbContextOptions<DemoDbContext> options) : base(options) { } /// <summary> /// 实体类创建Dbset属性,添加到DbSet /// </summary> public DbSet<Login> logins { get; set; } /// <summary> /// EF表名默认和DbSet属性名相同,覆盖默认行为,数据库中生成单数形式表名 /// </summary> /// <param name="modelBuilder"></param> protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Login>().ToTable("Login"); } } }
2 、注入服务
在Program.cs中注入DemoDbContext,同时添加添加数据库异常筛选器:
builder.Services.AddDbContext<DemoDbContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("DemoConnection"))); builder.Services.AddDatabaseDeveloperPageExceptionFilter(); //数据库异常筛选器
3、在系统配置文件appsettings.json中设置连接字符串
"ConnectionStrings": { "DemoConnection": "server=127.0.0.1;database=demo;uid=sa;pwd=1234" },
ps:如何读取appsettings.json配置
a、实体类的构造函数中使用IConfiguration,如在Home控制器中
private IConfiguration _configuration { get; } public HomeController(IConfiguration configuration) { _configuration = configuration; }
b、使用方法
//一级目录 _configuration["xxxx"]; //二级目录下的文件 _configuration["xxxx:yyyy"]; //获取并转为某某类型 _configuration.GetValue<int>("xxx"); //获取并序列化为某某类型 _configuration.GetSection("xxx").Get<某某类型>();
4、可以直接将连接字符串写入DbContext,并注入到Program.cs中
public class DemoDbContext: DbContext { protected override void OnConfiguring(DbContextOptionsBuilder options) { options.UseSqlServer(@"server=127.0.0.1;database=demo;uid=sa;pwd=1234"); } public DbSet<Login> logins { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Login>().ToTable("Login"); } }
三、创建数据库配置Migration
1、在程序包管理器控制台中,运行
PM> add-migration init
初始化成功后,控制台返回“Build succeeded”信息。同时,项目中生成一个Migrations文件夹,里面是迁移记录。
其中:xxx_init.cs是主迁移文件,包含应用迁移所需的操作 Up() 和还原迁移所需的操作Down()
xxx_init.Designe.cs迁移元数据文件。 包含 EF 所用的信息,如给实体类型构建属性、主键、外键、索引、映射到数据表,主体和依赖关系等等。
2、在程序包管理器控制台中,运行
PM> update-database
数据库创建成功后,控制台返回“Done.”信息。可以查看SQL server数据库,已经生成数据库和数据表
3、常见错误及解决:
错误1:ScriptHalted。解决:PowerShell版本低,在官网下载对应版本,网址:https://www.microsoft.com/en-us/download/details.aspx?id=54616
错误2:无法将“add-migration”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。解决:
--设置当前用户作用域具备 cmd> powershell PS > Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
--找到EntityFrameworkCore.psd1的全路径,在程序包管理控制台中执行 执行命令: "import-module ...\EntityFrameworkCore.psd1的全路径 " PM> import-module C:\Users\Administrator\.nuget\packages\microsoft.entityframeworkcore.tools\6.0.4\tools\EntityFrameworkCore.psd1 PM> Get-Verb
错误3:Your startup project 'Web_DEMO' doesn't reference Microsoft.EntityFrameworkCore.Design.解决:缺少NuGet包,在在该项目中安装:Install-Package Microsoft.EntityFrameworkCore.Tools
错误4:对象'PK_xxx' 依赖于 列'xxx'。由于一个或多个对象访问此列,ALTER TABLE ALTER COLUMN xxx 失败。解决:sqlserve中直接删除箭的约束,或使用语句alter table TableName drop constraint PK_xxx
4、Code First 数据注释
使用 DataAnnotations,可以将 Code First 类映射到预先存在的数据库,常用
[Key] [Required] [StringLength(50)] [Display(Name = "First Name")] [Column("FirstName")] [DataType(DataType.Date)] [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)] [DatabaseGenerated(DatabaseGeneratedOption.None)]
参考:https://blog.csdn.net/qq_39569480/article/details/114319127
四、添加Login控制器
using Microsoft.AspNetCore.Mvc; namespace Web_DEMO.Controllers { public class LoginController : Controller { public IActionResult Index() { return View(); } } }
生成构造函数LoginController(),也可以使用快捷键(ctor+两次Tab)
定义context,将数据上下文DemoDbContext 作为构造函数参数,依赖关系注入将 DemoDbContext 实例传递到控制器,添加using引用
using Microsoft.AspNetCore.Mvc; using Web_DEMO.Repository; namespace Web_DEMO.Controllers { public class LoginController : Controller { private readonly DemoDbContext context; public LoginController(DemoDbContext context) { _context = context; } public IActionResult Index() { return View(); } } }
修改Index()方法
using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using Web_DEMO.Repository; namespace Web_DEMO.Controllers { public class LoginController : Controller { private readonly DemoDbContext context; public LoginController(DemoDbContext context) { _context = context; } public async Task<IActionResult> Index() { return View(await _context.logins.ToListAsync()); } } }