EntityFrameworkCore 根据实体类自动创建数据库

时间:2022-06-18 04:00:38

1.首先新建 Asp.Net Core WebApi 项目

EntityFrameworkCore 根据实体类自动创建数据库

 

 

 

2.添加一下引用 :

   2.1   Pomelo.EntityFrameworkCore.MySql(我用的Mysql 根据自己情况引用就行)

  2.2  Microsoft.EntityFrameworkCore         

  2.3 Microsoft.EntityFrameworkCore.Design

 EntityFrameworkCore 根据实体类自动创建数据库

 

 

 

3.使项目支持dotnet ef 工具以使用Migrations

   3.1 手动修改csproj文件(手动添加是因为在nuget添加Microsoft.EntityFrameworkCore.Tools.DotNet 时报错,估计是vs的问题),添加一下配置

<ItemGroup>
<DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0" />
</ItemGroup>

EntityFrameworkCore 根据实体类自动创建数据库

 

 

 4.打开CMD命令 cd到项目目录下(C:UsersAdministratorsourcereposCodeFirstCodeFirst),执行 

dotnet build

 

Microsoft (R) Build Engine version 15.1.545.13942 Copyright (C) Microsoft Corporation. All rights reserved. Startup.cs(45,13): warning CS4014: Because this call is not awaited, execution of the current method continues before the call is completed. Consider applying the ‘await‘ operator to the result of the call. [C:WorkSpacesCDotNetCoreEntityFrameworkCoreMigrationsDemoEntityFrameworkCoreMigrationsDemoEntityFrameworkCoreMigrationsDemo.csproj] EntityFrameworkCoreMigrationsDemo -> C:WorkSpacesCDotNetCoreEntityFrameworkCoreMigrationsDemoEntityFrameworkCoreMigrationsDemobinDebugnetcoreapp1.0EntityFrameworkCoreMigrationsDemo.dll Build succeeded. Startup.cs(45,13): warning CS4014: Because this call is not awaited, execution of the current method continues before the call is completed. Consider applying the ‘await‘ operator to the result of the call. [C:WorkSpacesCDotNetCoreEntityFrameworkCoreMigrationsDemoEntityFrameworkCoreMigrationsDemoEntityFrameworkCoreMigrationsDemo.csproj] 1 Warning(s) 0 Error(s) Time Elapsed 00:00:04.76

5. 第4步完成后继续执行 

 dotnet ef 

 

EntityFrameworkCore 根据实体类自动创建数据库

 

 

 可以看见独角兽就说明引用成功了。距离胜利更近一步了

6.创建实例 StudentDbContext和相关实体类

using CodeFirst.Model.Entity;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Text;

namespace CodeFirst.Model.Db
{
  public class StudentDbContext: DbContext
    {
        public StudentDbContext(DbContextOptions<StudentDbContext> options)
            : base(options)
        {
        }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseMySql(
                @"Server=localhost;Port=3306;Database=Policy;UId=root;Pwd=mysql.com");
        }

        public DbSet<Student> Student { get; set; }
        public DbSet<Teacher> Teacher { get; set; }
    }
}
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Text;

namespace CodeFirst.Model.Entity
{
   public class Student
    {
        [Key]
        public int Id { get; set; }
        public string Name { get; set; }
        public Teacher Teach { get; set; }
    }
}
using System;
using System.Collections.Generic;
using System.Text;

namespace CodeFirst.Model.Entity
{
   public class Teacher
    {
        public int Id { get; set; }
        public int Age { get; set; }
        public List<Student> Stus { get; set; }
    }
}

7. 在Startup将StudentDbContext 注册为服务

EntityFrameworkCore 根据实体类自动创建数据库

 

 

 

8.使用Migrations  新建数据库初始化类DbInitializer

using CodeFirst.Model.Db;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;

namespace CodeFirst.Model
{
   public class DbInitializer
    {
        public void InitializeAsync(StudentDbContext context)
        {
            //var migrations = await context.Database.GetPendingMigrationsAsync();//获取未应用的Migrations,不必要,MigrateAsync方法会自动处理
             context.Database.MigrateAsync();//根据Migrations修改/创建数据库
        }
    }
}

9.在Startup.cs的Configure方法中,添加参数StudentContext context,netcore会使用DI将DbContext注入到Configure方法,并添加对DbInitializer的调用。

EntityFrameworkCore 根据实体类自动创建数据库

 

 

 10.使用dotnet ef命令创建Migrations:dotnet ef migrations add text  text随便起名

C:UsersAdministratorsourcereposCodeFirstCodeFirst>dotnet ef migrations add Initial

Build succeeded.
    0 Warning(s)
    0 Error(s)

Time Elapsed 00:00:02.32
Done. To undo this action, use ef migrations remove

如果执行dotnet ef migrations add Initial报错 :

EntityFrameworkCore 根据实体类自动创建数据库

 

 

解决办法执行下面两句 

PM> dotnet ef Migrations add Init No project was found. Change the current working directory or use the --project option.

定位到csproject

EntityFrameworkCore 根据实体类自动创建数据库

 

 完了继续操作就行 

   PM> add-migration test

   PM> update-database

 

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

执行成功后,可以看到项目目录下多了个文件夹Migrations,里面就是自动生成的Migrations文件。

创建更新Migrations的命令跟创建初始的一样,只是最后一个参数自己定义即可。

最后执行代码,成功创建了新的数据库,并且里面有一个表__EFMigrationsHistory,是自动生成的用来记录Migrations记录。

修改Student类   public string NewField { get; set; },在命令行执行命令dotnet ef migrations add NewField,然后运行程序,可以看到数据库已经更新,__EFMigrationsHistory表也多了一条对应的记录

 

 

生成数据库表:

EntityFrameworkCore 根据实体类自动创建数据库

 

 

Demo源码: Github

 

参考:https://www.cnblogs.com/yhnbgfd/p/6489278.html