zoukankan      html  css  js  c++  java
  • EntityFrameworkCore 根据实体类自动创建数据库

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

    2.添加一下引用 :

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

      2.2  Microsoft.EntityFrameworkCore         

      2.3 Microsoft.EntityFrameworkCore.Design

     

    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>

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

    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:WorkSpacesCDotNetCoreEntityFrameworkCoreMigrationsDemoEntityFrameworkCoreMigrationsDemoinDebug etcoreapp1.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 

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

    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 注册为服务

    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的调用。

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

    C:UsersAdministratorsource
    eposCodeFirstCodeFirst>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报错 :

    解决办法执行下面 

    定位到csproject

    PM> dotnet ef migrations script --verbose -i --project "C:UsersAdministratorsource eposCodeFirstCodeFirst"

     完了继续操作就行 

       PM> add-migration test

       PM> update-database

    生成数据库表:

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

    修改Student实体类加一个Sex字段

            public string Sex { get; set; }

    执行 (注意执行命令之前在控制台‘默认项目’列表选中DbContext所在的类库,不然爆错)

    Add-Migration ModifyStudent

     再执行

    PM> Update-Database

    数据库已经更新

     

    Demo源码: Github

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

  • 相关阅读:
    Hadoop学习笔记——配置文件
    Hive学习笔记——SerDe
    MapReduce中的OutputFormat
    Nginx 转发时的一个坑,运维居然让我背锅!!
    教你用 Netty 实现一个简单的 RPC!
    完整的支付系统整体架构!
    String 拼接一定会走 StringBuilder?
    腾讯牛逼!终于开源了自家的 Tencent JDK——Kona!!
    Java 数组转 List 的 3 种方式,哪种性能最牛?
    Spring Boot 2.4.0 发布,配置文件重大调整,不要乱升级!!
  • 原文地址:https://www.cnblogs.com/bin521/p/11697013.html
Copyright © 2011-2022 走看看