轻松学EntityFramework Core--模型创建

一、使用代码优先(Code-First)创建模型

Code-First 方法是 EF Core 提供的一种用于定义模型的方式,它允许开发人员通过编写 C# 类来定义数据库模式,再通过迁移命令生成数据库表。下面我们来一起看一下代码优先如何使用。

1.1、创建项目并安装 EF Core

首先,创建一个新的 .NET 项目并安装 EF Core 包:

dotnet new console -n EFCoreCodeFirst
cd EFCoreCodeFirst
dotnet add package Microsoft.EntityFrameworkCore
dotnet add package Microsoft.EntityFrameworkCore.SqlServer
dotnet add package Microsoft.EntityFrameworkCore.Tools
1.2、 定义模型类

接下来我们来定义一个博客系统的两个实体类 BlogPost

public class Blog
{public int BlogId { get; set; }public string Url { get; set; }public List<Post> Posts { get; set; }
}public class Post
{public int PostId { get; set; }public string Title { get; set; }public string Content { get; set; }public int BlogId { get; set; }public Blog Blog { get; set; }
}

在这两个类中,我们看 Blog 类中存在 Post 类的 List 集合, Post 类中存在 Blog 类的实例和, Blog 实例的Id。具体它们的作用是什么,我们会在关系映射这一节详细讲解,在这里我们只需要知道这三个属性表示了 BlogPost 的关系即可。

2.3、 创建上下文类

接下来我们定义一个派生自 DbContext 的上下文类,它代表与数据库的会话,并且允许查询和保存数据。上下文类包含 DbSet<TEntity> 属性,表示数据库中的表。

public class BloggingContext : DbContext
{public DbSet<Blog> Blogs { get; set; }public DbSet<Post> Posts { get; set; }protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder){optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=BloggingDB;Trusted_Connection=True;");}
}

在上面的代码中 BloggingContext 类继承自 DbContext,它定义了与数据库交互的上下文。DbSet<Blog> BlogsDbSet<Post> Posts 是 DbSet 属性,分别代表数据库中的 Blog 和 Post 实体集合。DbSet 是一个用于查询和保存数据库中实体集合的集合。OnConfiguring 方法被重写,用来配置数据库上下文的数据库提供者和连接字符串,在这个例子中,它配置了使用SQL Server作为数据库提供者,并提供了一个连接字符串,指向名为 BloggingDB 的本地数据库。

2.4、 创建数据库

OK!模型定义完了,上下文类也创建了,现在我们就使用迁移命令来创建数据库。
首先,初始化迁移:

dotnet ef migrations add InitialCreate

初始化迁移完成后,会生成一个 Migrations 文件夹,它包含创建数据库的代码。
然后,更新数据库以应用迁移:

dotnet ef database update

迁移完成后,数据库及其表将会创建完成。
在这里插入图片描述
我们从数据库中看到,除了我们要创建的Blogs和Posts表外,还多了一张__EFMigrationsHistory表,__EFMigrationsHistory是一个特殊的表,它用于跟踪数据库模式的变更历史。当使用Entity Framework Core的迁移功能时,每次应用迁移(migration)到数据库时,迁移的元数据就会被记录在这个表中。__EFMigrationsHistory 表通常由Entity Framework Core自动创建和管理,开发者不需要手动操作这个表。表的结构如下:

  • MigrationId:唯一标识一个迁移的字符串。
  • ProductVersion:应用迁移时使用的Entity Framework Core的版本。

总结起来 __EFMigrationsHistory 表的作用有如下5点:

  1. 迁移跟踪:它记录了哪些迁移已经被应用到数据库上。这允许Entity Framework Core知道当前数据库的模式状态,并确定哪些迁移需要被应用或回滚。
  2. 版本控制:表中的记录提供了数据库模式的版本历史,这有助于团队协作和数据库模式的版本控制。
  3. 迁移应用顺序:__EFMigrationsHistory 表中的记录通常包含迁移名称和应用时间戳,这有助于了解迁移的顺序和时间。
  4. 回滚支持:如果需要回滚到之前的数据库模式状态,Entity Framework Core可以使用这个表来确定哪些迁移需要被撤销。
  5. 避免重复应用:由于迁移的元数据被记录在这个表中,Entity Framework Core可以避免重复应用相同的迁移,确保数据库模式的一致性。
2.5、 使用上下文类

现在,我们可以在代码中使用上下文类来操作数据库了:

class Program
{static void Main(string[] args){using (var db = new BloggingContext()){// 创建并保存新的博客var blog = new Blog { Url = "http://sample.com" };db.Blogs.Add(blog);db.SaveChanges();// 查询并显示所有博客var blogs = db.Blogs.ToList();foreach (var b in blogs){Console.WriteLine($"BlogId: {b.BlogId}, Url: {b.Url}");}}}
}

在上面的代码中,我们创建数据库上下文实例,使用 using 语句创建了 BloggingContext 的实例。然后我们创建了一个新的 Blog 实例,并设置其 Url 属性,并使用 Add 方法将其添加到 Blogs 集合中。最后调用 SaveChanges 方法将更改保存到数据库中。
在这里插入图片描述
接下来使用 ToList 方法查询数据库中的所有博客,并将其存储在 blogs 变量中。最后使用 foreach 循环遍历 blogs 集合,并打印每个博客的 BlogIdUrl

1.6、 完整示例代码

以下是完整的示例代码:

using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;public class Blog
{public int BlogId { get; set; }public string Url { get; set; }public List<Post> Posts { get; set; }
}public class Post
{public int PostId { get; set; }public string Title { get; set; }public string Content { get; set; }public int BlogId { get; set; }public Blog Blog { get; set; }
}public class BloggingContext : DbContext
{public DbSet<Blog> Blogs { get; set; }public DbSet<Post> Posts { get; set; }protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder){optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=BloggingDB;Trusted_Connection=True;");}
}class Program
{static void Main(string[] args){using (var db = new BloggingContext()){// 创建并保存新的博客var blog = new Blog { Url = "http://sample.com" };db.Blogs.Add(blog);db.SaveChanges();// 查询并显示所有博客var blogs = db.Blogs.ToList();foreach (var b in blogs){Console.WriteLine($"BlogId: {b.BlogId}, Url: {b.Url}");}}}
}

通过上述步骤,我们已经成功使用 Code-First 方法创建并使用了一个简单的 EF Core 模型。我们可以根据需要扩展模型和上下文类,以实现更复杂的数据库操作。

二、使用数据库优先(Database-First)创建模型

在 Entity Framework Core 中,Database-First 方法允许我们从现有的数据库生成模型。这通常用于我们已经有一个数据库并希望生成与其结构对应的实体类和上下文类。

2.1、 生成模型

使用 dotnet ef dbcontext scaffold 命令从现有数据库生成模型。需要提供连接字符串和数据库提供程序:

dotnet ef dbcontext scaffold "Server=(localdb)\mssqllocaldb;Database=BloggingDB;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -o Models

这个命令将连接到名为 BloggingDB 的数据库,并生成包含模型和上下文类的 Models 文件夹。生成完成我们就可以解决方案中看到生成的数据库模型类和数据库链接上下文。
在这里插入图片描述

2.2、 使用生成的模型

在生成模型后,我们可以在代码中使用上下文类和实体类。例如:

using System;
using System.Linq;
using EFCoreDatabaseFirst.Models;class Program
{static void Main(string[] args){using (var db = new BloggingDbContext()){// 查询并显示所有表中的数据var items = db.Blogs.ToList(); foreach (var item in items){Console.WriteLine($"Id: {item.BlogId}, Url: {item.Url}");}}}
}
2.3、生成代码示例
  1. Blog 实体类
namespace EFCoreDatabaseFirst.Models;public partial class Blog
{public int BlogId { get; set; }public string Url { get; set; } = null!;public virtual ICollection<Post> Posts { get; set; } = new List<Post>();
}
  1. Post 实体类
namespace EFCoreDatabaseFirst.Models;public partial class Post
{public int PostId { get; set; }public string Title { get; set; } = null!;public string Content { get; set; } = null!;public int BlogId { get; set; }public virtual Blog Blog { get; set; } = null!;
}
  1. 上下文类
namespace EFCoreDatabaseFirst.Models;public partial class BloggingDbContext : DbContext
{public BloggingDbContext(){}public BloggingDbContext(DbContextOptions<BloggingDbContext> options): base(options){}public virtual DbSet<Blog> Blogs { get; set; }public virtual DbSet<Post> Posts { get; set; }protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
#warning To protect potentially sensitive information in your connection string, you should move it out of source code. You can avoid scaffolding the connection string by using the Name= syntax to read it from configuration - see https://go.microsoft.com/fwlink/?linkid=2131148. For more guidance on storing connection strings, see https://go.microsoft.com/fwlink/?LinkId=723263.=> optionsBuilder.UseSqlServer("Server=(localdb)\\mssqllocaldb;Database=BloggingDB;Trusted_Connection=True;");protected override void OnModelCreating(ModelBuilder modelBuilder){modelBuilder.Entity<Post>(entity =>{entity.HasIndex(e => e.BlogId, "IX_Posts_BlogId");entity.HasOne(d => d.Blog).WithMany(p => p.Posts).HasForeignKey(d => d.BlogId);});OnModelCreatingPartial(modelBuilder);}partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
}

通过上述步骤,我们可以使用 Database-First 方法从现有数据库生成 EF Core 模型,并在代码中使用生成的模型类和上下文类。这种方法特别适合已有数据库架构并希望快速生成数据访问代码的场景。

三、总结

在 Entity Framework Core 中,Code-First 方法允许开发人员通过编写 C# 类定义数据库模式,并使用迁移命令生成数据库表。首先,创建一个新的 .NET 项目并安装 EF Core 包。接着,定义模型类,如博客系统的 BlogPost 实体类,分别表示博客和博客文章,关联关系通过属性表示。在此基础上,创建上下文类 BloggingContext,该类继承自 DbContext,包含 DbSet<TEntity> 属性,表示数据库中的表,并配置数据库连接字符串。使用 dotnet ef migrations add InitialCreate 命令生成数据库迁移文件,随后通过 dotnet ef database update 应用迁移并创建数据库。最终,通过代码使用上下文类 BloggingContext 操作数据库,创建并保存新的博客数据,并查询显示所有博客。
Database-First 方法适用于从现有数据库生成模型。在创建项目并安装 EF Core 包后,使用 dotnet ef dbcontext scaffold 命令从数据库生成模型类和上下文类,指定连接字符串和数据库提供程序。生成的模型类和上下文类在代码中使用,以操作数据库。以博客系统为例,通过 BlogPost 实体类及其上下文类 BloggingDbContext,实现数据库的查询和数据操作。Database-First 方法特别适合已有数据库架构的场景,便于快速生成与数据库结构对应的数据访问代码。
这两种方法各有优劣,Code-First 适用于从零开始设计数据库结构,而 Database-First 适用于已有数据库的项目,开发者可根据具体需求选择合适的方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/384656.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

问题记录-SpringBoot 2.7.2 整合 Swagger 报错

详细报错如下 报错背景&#xff0c;我将springboot从2.3.3升级到了2.7.2&#xff0c;报了下面的错误&#xff1a; org.springframework.context.ApplicationContextException: Failed to start bean documentationPluginsBootstrapper; nested exception is java.lang.NullPo…

MySQL练手 --- 1789. 员工的直属部门

题目链接&#xff1a;1789. 员工的直属部门 这道题虽然是个简单题&#xff0c;但是"坑"倒是不少&#xff0c;所以记录一下 思路&#xff1a; 题目要干&#xff1a; 一个员工可以属于多个部门。当一个员工加入超过一个部门的时候&#xff0c;他需要决定哪个部门是…

导航网站WP主题/WP黑格导航主题BlackCandy-简约酷黑色高逼格+焕然一新的UI设计

源码简介&#xff1a; 导航网站WP主题-WP黑格导航主题BlackCandy&#xff0c;它有着简约酷黑色高逼格&#xff0c;而且有焕然一新的UI设计。它是一个简约漂亮的 WordPress 自媒体主题。黑格网址导航主题&#xff0c;自适应电脑端和手机端。 BlackCandy-V2.0这次全新升级了&am…

mac M1安装Roop教程及所遇到的问题

1.安装miniconda&#xff0c;下载地址&#xff1a; 按 Python 版本划分的最新 Miniconda 安装程序链接&#xff1a;https://docs.anaconda.com/miniconda/miniconda-other-installer-links/ 下载后直接默认安装即可。 我用的是&#xff1a;Python3.10对应的Miniconda 2.下载…

哪个邮箱最安全最好用啊

企业邮箱安全至关重要&#xff0c;需保护隐私、防财务损失、维护通信安全、避免纠纷&#xff0c;并维持业务连续性。哪个企业邮箱最安全好用呢&#xff1f;Zoho企业邮箱&#xff0c;采用加密技术、反垃圾邮件和病毒保护&#xff0c;支持多因素认证&#xff0c;确保数据安全合规…

nodejs - express 学习笔记

express 是一个基于 Node.js 平台的极简、灵活的 WEB 应用开发框架&#xff0c;官方网址&#xff1a;https://www.expressjs. com.cn/ 简单来说&#xff0c;express 是一个封装好的工具包&#xff0c;封装了很多功能&#xff0c;便于我们开发 WEB 应用&#xff08;HTTP 服务&am…

EasyMedia转码rtsp视频流flv格式,hls格式,H5页面播放flv流视频

EasyMedia转码rtsp视频流flv格式&#xff0c;hls格式 H5页面播放flv流视频 文章最后有源码地址 解决海康视频播放视频流&#xff0c;先转码后自定义页面播放flv视频流 先看效果&#xff0c;1&#xff0c;EasyMedia自带的页面&#xff0c;这个页面二次开发改动页面比较麻烦 …

秋叶大神中文版Stable Diffusion下载安装使用教程

Stable Diffusion是什么&#xff1f; Stable Diffusion是一款开源的AI绘画软件&#xff0c;于2022年发布&#xff0c;由CompVis、Stability AI和LAION的研究人员创建。该软件具有出色的图像生成功能&#xff0c;使用户能够从头开始绘制作品&#xff0c;也可以使用现有的图像进…

Sentinel限流规则详解

上一期教程讲解了 Sentinel 的快速入门&#xff1a;Sentinel快速入门&#xff0c;这一期主要讲述 Sentinel 的限流规则 簇点链路 簇点链路就是项目内的调用链路&#xff08;Controller -> Service -> Mapper&#xff09;&#xff0c;链路中被监控的每个接口就是一个资源…

Jenkins+Maven+Gitlab+Tomcat自动化构建打包+部署

目录 环境准备 导入项目包 配置jenkins 构建项目 配置项目上线 修改项目代码测试 环境准备 本实操项目环境基于https://blog.csdn.net/Lzcsfg/article/details/140359830 首先在node01主机中操作&#xff0c;本次操作需要java8的版本&#xff0c;将之前安装的java17卸…

Shell编程之正则表达式与文本三剑客

目录 一、正则表达式 1.引言--什么是正则表达式 1.1正则表达式的功能 2.基础正则表达式&#xff08;BRE&#xff09; 2.1特殊字符 2.2定位符 2.3非打印字符 3.扩展正则表达式(ERE) 4.元字符操作的案列 二、命令小工具 1.cut&#xff1a;列截取工具 2.sort排序 …

请你谈谈:spring bean的生命周期 - 阶段5:BeanPostProcessor前置处理-自定义初始化逻辑-BeanPostProcess后置处理

BeanPostProcessor的postProcessBeforeInitialization方法是在bean的依赖注入&#xff08;即属性填充&#xff09;完成后&#xff0c;但在bean的初始化回调&#xff08;如PostConstruct注解的方法或InitializingBean接口的afterPropertiesSet方法&#xff09;之前被调用的。 具…

大数据管理中心设计规划方案(可编辑的43页PPT)

引言&#xff1a;随着企业业务的快速发展&#xff0c;数据量急剧增长&#xff0c;传统数据管理方式已无法满足高效处理和分析大数据的需求。建立一个集数据存储、处理、分析、可视化于一体的大数据管理中心&#xff0c;提升数据处理能力&#xff0c;加速业务决策过程&#xff0…

Hive3:Hive初体验

1、创建表 CREATE TABLE test(id INT, name STRING, gender STRING);2、新增数据 INSERT INTO test VALUES(1, 王力红, 男); INSERT INTO test VALUES(2, 钉钉盯, 女); INSERT INTO test VALUES(3, 咔咔咔, 女);3、查询数据 简单查询 select * from test;带聚合函数的查询 …

自动驾驶-机器人-slam-定位面经和面试知识系列01之常考公式推导(01)

李群李代数扰动bundle adjustment 这个博客系列会分为C STL-面经、常考公式推导和SLAM面经面试题等三个系列进行更新&#xff0c;基本涵盖了自己秋招历程被问过的面试内容&#xff08;除了实习和学校项目相关的具体细节&#xff09;。在知乎和牛客也会同步更新&#xff0c;全网…

IDEA-安装插件 驼峰下划线转换

第一步&#xff1a;安装 file-settings-plugins-在marketplace搜索“CamelCase”-点击安装 第二步&#xff1a;设置 file-settings-editor-camel_case 第三步&#xff1a;使用 选中想转换的遍历 使用快捷键 Alt Shift U

Linux中tomcat下载教程

一.安装tomcat 1.安装 EPEL 仓库&#xff1a; sudo yum install epel-release2.安装 Tomcat&#xff1a; sudo yum install tomcat3.启动 Tomcat 服务&#xff1a; sudo systemctl start tomcat4.启用 Tomcat 服务开机启动&#xff1a; sudo systemctl enable tomcat5.检查…

Java | Leetcode Java题解之第283题移动零

题目&#xff1a; 题解&#xff1a; class Solution {public void moveZeroes(int[] nums) {int n nums.length, left 0, right 0;while (right < n) {if (nums[right] ! 0) {swap(nums, left, right);left;}right;}}public void swap(int[] nums, int left, int right)…

ElasticSearch(三)—文档字段参数设置以及元字段

一、 字段参数设置 analyzer&#xff1a; 指定分词器。elasticsearch 是一款支持全文检索的分布式存储系统&#xff0c;对于 text类型的字段&#xff0c;首先会使用分词器进行分词&#xff0c;然后将分词后的词根一个一个存储在倒排索引中&#xff0c;后续查询主要是针对词根…

如何通过netsh命令重启主机网卡?

正文共&#xff1a;999 字 15 图&#xff0c;预估阅读时间&#xff1a;1 分钟 不知道各位遇到过没有&#xff0c;VMware Workstation的NAT网卡经常出现一种情况&#xff1a;在虚拟机里面访问外部网络还是正常的&#xff0c;但是从宿主机却访问不到虚拟机。 说实话&#xff0c;这…