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());
        }
    }
}

 

posted @ 2021-05-23 18:33  生之韵  阅读(971)  评论(0编辑  收藏  举报