首页 > 数据库 >EF 管理数据库架构

EF 管理数据库架构

时间:2023-07-29 17:11:10浏览次数:37  
标签:core set 架构 get 数据库 EF 迁移 public ef

本章会主要了解EF提供的独立迁移项目,用独立迁移项目自动创建dgml设计关系图和sql脚本。
迁移项目通常也叫(CodeFirst代码优先),在EF中迁移项目是在,在代码中设计数据库,每次对数据库的设计都将被保留记录。这种模式只会向前修改,不会向后修改。因为一旦数据已经存在,不易删除改变结构,只能改列名和数据类型。反向工程通常也叫(DatabaseFirst数据库优先),是指数据库的结构已经创建好了,这包含表结构,只需从数据库映射到代码中。

独立迁移项目

独立迁移项目,因为这种方式是最优的,代码不会和业务代码混淆,所以这里只讲最优的方式和命令。
一共分为三个步骤如下,最后展示一个结果。

创建业务项目

新建类库项目,创建以下实体。引用 Microsoft.EntityFrameworkCore.Relational 包,创建 DbContext 配置模型。

public class School
{
    [Key]
    public int Id { get; set; }
    public List<Student> Students { get; set; }
    public List<Teacher> Teachers { get; set; }
}
public class Student
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
    public List<Teacher> Teachers { get; set; }
}
public class Teacher
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
    public List<Student> Students { get; set; }
}
public class DomainDbContext : DbContext
{
    public DbSet<School> School { get; set; }
    public DbSet<Student> Student { get; set; }
    public DbSet<Teacher> Teacher { get; set; }
    public DomainDbContext(DbContextOptions options) : base(options)
    {
    }
}

创建独立迁移项目

新建类库项目。项目名称以 XXXX.EFMigrations 结尾,这样能表示它是个EF迁移项目。
引用 上面的业务项目,再安装nuget包。Microsoft.EntityFrameworkCore.Design 是迁移工具的核心包。ErikEJ.EntityFrameworkCore.DgmlBuilder 是Dgml可视化关系图包,它是微软官方文档中推荐的。Microsoft.EntityFrameworkCore.SqlServer 是打算使用 SqlServer 数据库,可以换成别的数据库。

创建设计时 DbContext
public class DesignTimeDbContext : DomainDbContext
{
    public DesignTimeDbContext(DbContextOptions options) : base(options)
    {
    }
}
创建设计时工厂
public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory<DesignTimeDbContext>
{
    public readonly string FullPath = @$"{Directory.GetCurrentDirectory()}\{nameof(DomainDbContext)}";
    public DesignTimeDbContext CreateDbContext(string[] args)
    {
        var builder = new DbContextOptionsBuilder<DesignTimeDbContext>()
            .UseSqlServer();

        var context = new DesignTimeDbContext(builder.Options);

        if (args.Contains("dgml"))
        {
            File.WriteAllText(@$"{FullPath}.dgml", context.AsDgml());
        }
        if (args.Contains("sql"))
        {
            File.WriteAllText(@$"{FullPath}.sql", context.Database.GenerateCreateScript());
        }
        return context;
    }
}

独立迁移项目执行命令

dotnet ef migrations add InitialCreate -- dgml sql
-- 代表使用参数 args,dgml 将生成关系图,sql 将生成sql脚本。
迁移命令请查阅官方文档迁移命令:https://learn.microsoft.com/zh-cn/ef/core/managing-schemas/migrations/?tabs=dotnet-core-cli ,这里不叙述重复内容了。

结果

image

反向工程

目前的反向工程项目,最常用的是 EF Core Power Tools,是Visual Studio扩展。https://learn.microsoft.com/zh-cn/ef/core/extensions/#ef-core-power-tools 它是微软官方推荐。
在VS插件中安装后,右键项目会看到如下视图。
image

最后

整理了微软文档中的内容,参考微软文档如下:
https://learn.microsoft.com/zh-cn/ef/core/cli/dbcontext-creation?tabs=dotnet-core-cli
https://learn.microsoft.com/zh-cn/ef/core/extensions/#ef-core-power-tools
https://learn.microsoft.com/zh-cn/ef/core/extensions/#erikejentityframeworkcoredgmlbuilder
https://learn.microsoft.com/zh-cn/ef/core/managing-schemas。如有异议欢迎探讨。

标签:core,set,架构,get,数据库,EF,迁移,public,ef
From: https://www.cnblogs.com/YataoFeng/p/17590119.html

相关文章

  • 如何拉取指定CPU架构的并且指定ubuntu版本的docker镜像
     拉取不同CPU架构下ubuntu22.04镜像:aarch64(armv8)CPU架构:dockerpull--platform=linux/aarch64ubuntu:22.04 x86_64CPU架构:dockerpull--platform=linux/x86_64ubuntu:22.04  ---------------------------------------------------------------------------......
  • KV存储架构学习
    原文: 美团万亿级KV存储架构与实践美团KV存储历程一致性hash->memcached宕机摘除节点,会丢失数据扩容一致性hash也会丢数据。一致性hash->redis主从哨兵可以管理节点宕机扩缩容还是不行。阿里Tair美团基于tair研发出Cellar美团自研Squirrel基于开源redi......
  • 数据库连接
    目录1、mysql启动和停止2、mysql登录3、Navicate连接问题问题1问题21、mysql启动和停止mysql>netstopmysqlmysql>netstartmysql2、mysql登录1、连接服务器:mysql-uroot-p2、看当前所有数据库:showdatabases;3、进入mysql数据库:usemysql;4、......
  • QEMU启动RISC-V架构OpenEuler并配置OSC环境
    基于Ubuntu18.04,QEMU8.0.2,OpenEuler22.09安装QEMU安装基础编译工具sudoaptinstallbuild-essentialautoconfautomakeautotools-devpkg-configbccurl\gawkgitbisonflextexinfogperflibtoolpatchutilsmingw-w64libmpc-dev\......
  • 在 SQL Server 中获取数据库备份历史记录
    有多种方法可以获取SQLServer中的数据库备份历史记录。这里我列出了两种获取备份历史记录的最快方法。我经常使用这些方法。这些方法将有助于在对数据库进行重大更改之前确认最新的备份是否已成功进行。使用备份和恢复事件报告如果您使用SQLServerManagementStudio (SSMS......
  • Vue 2 和 Vue 3 中 toRefs的区别
    摘要:本文将介绍Vue2和Vue3中toRefs函数的不同用法和行为,并解释其在各个版本中的作用。正文:Vue是一款流行的JavaScript框架,用于构建用户界面。在Vue2和Vue3中,都存在一个名为toRefs的函数,但其行为在这两个版本中有所不同。Vue2中的toRefs在Vue2中,使用......
  • 传奇数据库dbc2000如何卸载呢?
    在之前的文章里,多多亲笔写了dbc2000数据库安装、汉化、破解视频教程,今天给大家写一个一dbc2000如何卸载的图文教程,其实对于软件的卸载和安装是差不多的,只要看得懂中文的都能够完成,只是完整的时间不一样,但我可不是为了写一篇如何卸载DBC2000的,而是另有作用的。如果你的电脑上安装了3......
  • Adobe After Effects 2023 v23.4 (macOS, Windows) - 后期特效
    AdobeAfterEffects2023v23.4(macOS,Windows)-后期特效Acrobat、AfterEffects、Animate、Audition、Bridge、CharacterAnimator、Dimension、Dreamweaver、Illustrator、InCopy、InDesign、LightroomClassic、MediaEncoder、Photoshop、PremierePro、AdobeXD请访......
  • 使用 systemd timer 备份数据库
    定义timer文件进入目录/usr/lib/systemd/system,按如下文件建立timer:[Unit]Description=Runsdbbackupeveryhour[Timer]#TimetowaitafterbootingbeforewerunfirsttimeOnBootSec=10min#TimebetweenrunningeachconsecutivetimeOnUnitActiveSec=1hUnit=db_b......
  • Oracle数据库DB_NAME、SERVICE_NAME、SID、INSTANCE_NAME、DB_UNIQUE_NAME的区别 转
    Oracle数据库DB_NAME、DBID、DB_UNIQUE_NAME、SERVICE_NAME、SID、INSTANCE_NAME、GLOBAL_DATABASE_NAME的区别DB_NAME:①是数据库名,长度不能超过8个字符,记录在datafile、redolog和controlfile中②在DataGuard环境中DB_NAME相同而DB_UNIQUE_NAME不同③在RAC环境中,各个节点的DB_......