【EF Core】两种使用模式(Code First、Database First)

文章目录

      • Code First
      • Database First
      • Code First 示例
        • 安装 Entity Framework Core
        • 创建模型
        • 创建数据库
        • 创建、读取、更新和删除
      • Database First 示例
        • 1. 使用Scaffold-DbContext命令生成代码(通常在Package Manager Console中执行)
        • 2. 生成的代码类似于Code First中的实体类和DbContext,但它们是基于现有数据库的。
        • 3. 使用生成的DbContext操作数据库

Entity Framework Core (EF Core) 是 Microsoft 提供的一个对象关系映射器 (ORM),它允许开发者使用 .NET 对象来处理数据库。EF Core 提供了几种使用模式,帮助开发者根据项目需求高效地管理数据库和对象之间的关系。以下是 EF Core 的主要使用模式:

Code First

Code First 是 EF Core 中最常用的模式。在这种模式下,开发者首先定义 C# 类(通常称为实体或模型),然后 EF Core 根据这些类生成数据库结构。Code First 允许开发者完全控制数据库结构,因为它基于代码中的类和配置来创建数据库。

使用 Code First 的好处包括:

  • 完全的数据库控制
  • 可以通过迁移(Migrations)轻松地进行版本控制
  • 支持测试驱动的开发

要启用 Code First,你需要定义实体类,配置 DbContext,并可能还需要配置一些额外的映射或约定。

Database First

Database First 允许开发者从现有的数据库开始,并使用 EF Core 反向工程工具(如 Scaffold-DbContext)来生成 C# 实体类和 DbContext。这样,开发者就可以使用 EF Core 的功能来查询、更新和删除数据库中的数据,而无需手动编写 SQL 代码。

使用 Database First 的好处包括:

  • 可以基于现有数据库进行开发
  • 快速生成 C# 实体类和 DbContext
  • 仍然可以利用 EF Core 的所有功能

要使用 Database First,你需要先有一个数据库,并使用 EF Core 的反向工程工具来生成代码。

在选择使用哪种模式时,你应该考虑项目的需求、开发者的技能和偏好以及项目的长期规划。对于大多数新项目,Code First 通常是一个很好的选择,因为它提供了最大的灵活性和控制力。然而,如果你正在与现有的数据库进行交互,或者你的团队更习惯于使用图形化工具来管理数据模型,那么 Database First 可能更适合你。

Model First 曾经是 EF(非 Core)版本中的一个特性,但在 EF Core 中,这个模式并不直接支持。在 ModelFirst 模式下,开发者使用图形化工具(如 Entity Framework Designer)来创建EDMX(实体数据模型)文件,这个文件定义了数据模型和映射。然后,EF 会根据这个模型生成数据库结构。由于 EF Core 不直接支持 Model First,如果你想要使用类似的功能,你可能需要手动创建 EDMX文件(这通常不推荐,因为它与 EF Core 不兼容),或者使用 Code First 并依赖第三方工具来生成和维护图形化模型。

Code First 示例

安装 Entity Framework Core

“工具”>“NuGet 包管理器”>“包管理器控制台”。

运行以下命令:

Install-Package Microsoft.EntityFrameworkCore.Sqlite

提示:还可以通过右键单击项目并选择“管理 NuGet 程序包”来安装包

创建模型

右键单击项目,然后选择“添加”>“类”
输入“Model.cs”作为名称,然后单击“添加”
将此文件的内容替换为以下代码

using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;public class BloggingContext : DbContext
{public DbSet<Blog> Blogs { get; set; }public DbSet<Post> Posts { get; set; }public string DbPath { get; }public BloggingContext(){var folder = Environment.SpecialFolder.LocalApplicationData;var path = Environment.GetFolderPath(folder);DbPath = System.IO.Path.Join(path, "blogging.db");}// The following configures EF to create a Sqlite database file in the// special "local" folder for your platform.protected override void OnConfiguring(DbContextOptionsBuilder options)=> options.UseSqlite($"Data Source={DbPath}");
}public class Blog
{public int BlogId { get; set; }public string Url { get; set; }public List<Post> Posts { get; } = new();
}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; }
}

EF Core 还可以从现有数据库对模型进行反向工程。

提示:为清楚起见,有意简化了此应用程序。 连接字符串不应存储在生产应用程序的代码中。 可能还需要将每个 C# 类拆分为其自己的文件。

创建数据库

在“包管理器控制台(PMC)”中,运行以下命令

Install-Package Microsoft.EntityFrameworkCore.Tools
Add-Migration InitialCreate
Update-Database

这会安装 EF Core 的 PMC 工具。 Add-Migration 命令为迁移搭建基架,以便为模型创建一组初始表。 Update-Database 命令创建数据库并向其应用新的迁移。

创建、读取、更新和删除

打开 Program.cs 并将内容替换为以下代码:

using System;
using System.Linq;using var db = new BloggingContext();// Note: This sample requires the database to be created before running.
Console.WriteLine($"Database path: {db.DbPath}.");// Create
Console.WriteLine("Inserting a new blog");
db.Add(new Blog { Url = "http://blogs.msdn.com/adonet" });
db.SaveChanges();// Read
Console.WriteLine("Querying for a blog");
var blog = db.Blogs.OrderBy(b => b.BlogId).First();// Update
Console.WriteLine("Updating the blog and adding a post");
blog.Url = "https://devblogs.microsoft.com/dotnet";
blog.Posts.Add(new Post { Title = "Hello World", Content = "I wrote an app using EF Core!" });
db.SaveChanges();// Delete
Console.WriteLine("Delete the blog");
db.Remove(blog);
db.SaveChanges();

Database First 示例

在Database First模式中,我们从现有的数据库开始,并使用EF Core的反向工程工具(如Scaffold-DbContext)来生成C#实体类和DbContext。

1. 使用Scaffold-DbContext命令生成代码(通常在Package Manager Console中执行)
Scaffold-DbContext "Server=myServerAddress;Database=myDataBase;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -Context BloggingContext -Tables Blogs,Posts

这条命令会根据指定的数据库连接字符串、数据库提供程序(在这个例子中是SqlServer)、输出目录、DbContext名称以及要包含的表来生成代码。

2. 生成的代码类似于Code First中的实体类和DbContext,但它们是基于现有数据库的。

生成的代码可能类似于上面的Code First示例,但细节(如属性名、数据类型、关系等)将完全基于数据库的结构。

3. 使用生成的DbContext操作数据库

一旦代码被生成,你就可以像使用Code First模式一样使用这些实体类和DbContext来操作数据库了。

请注意,由于Model First在EF Core中并不直接支持,所以没有直接的代码示例。如果你需要类似的功能,你可能需要手动创建EDMX文件(但这通常不推荐,因为它与EF Core不兼容),或者使用Code First模式并依赖第三方工具来生成和维护图形化模型。

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

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

相关文章

金融行业专题|某头部期货基于 K8s 原生存储构建自服务数据库云平台

为了进一步提升资源交付效率&#xff0c;不少用户都将数据库应用从物理环境迁移到容器环境。而对于 Kubernetes 部署环境&#xff0c;用户不仅需要考虑数据库在性能方面的需求&#xff0c;还要为数据存储提供更安全、可靠的高可用保障。 近期&#xff0c;某头部期货机构基于 S…

新手摄影技巧总结

拍摄好看的照片不仅仅依赖于相机的硬件配置&#xff0c;还需要掌握一些基本的摄影技巧和相机设置。以下是一些建议&#xff0c;帮助你利用佳能EOS R62拍出更好看的照片&#xff1a; 1. 了解相机设置 模式选择&#xff1a;学习使用不同的拍摄模式&#xff08;如光圈优先、快门…

PaddleOCR C++源码编译以及demo测试

Windows10下使用PaddleOCRc 1.所需要的环境 PaddleOCR 源码文件&#xff1a;https://gitee.com/paddlepaddle/PaddleOCR &#xff08;本文选择2.6https://github.com/PaddlePaddle/PaddleOCR/archive/refs/tags/v2.6.0.zip&#xff09; opencv库&#xff1a;https://opencv…

PyTorch的环境配置和安装

PyTorch环境配置及安装 初步机器学习&#xff0c;这里记录下一些学习经过&#xff0c;之后以便于自己查看&#xff0c;同时欢迎各位大佬点评&#xff0c;本节是机器计算的一个包的安装和简单验证。 安装、使用环境 Windows环境下&#xff1a;CUDA官网使用IDM下载就很快乐&am…

LeetCode11. 盛最多水的容器题解

LeetCode11. 盛最多水的容器题解 题目链接&#xff1a; https://leetcode.cn/problems/container-with-most-water 示例 思路 暴力解法 定住一个柱子不动&#xff0c;然后用其他柱子与其围住面积&#xff0c;取最大值。 代码如下&#xff1a; public int maxArea1(int[]…

flex布局学习笔记(flex布局教程)

前端笔试⾯试经常会问到:不定宽⾼如何⽔平垂直居中。最简单的实现⽅法就是flex布局,⽗元素加上如下代码即 可: display: flex; justify-content: center; align-items :center; 。下⾯详细介绍下flex布局吧。 2009年,W3C提出了 Flex布局,可以简便⼂完整⼂响应式地实现各种…

AI儿童绘本创作

之前分享过AI儿童绘画的项目&#xff0c;但是主要问题是角色一致要花费很长的时间&#xff01; 今天发现了这款&#xff0c;非常奈斯&#xff01; 只需输入故事主题、风格、模板&#xff0c;软件就会自动创作故事内容&#xff0c;自动生成插画配图&#xff0c;自动根据模板生…

mysql问题Illegal mix of collations (utf8mb4_unicode_ci,IMPLICIT)

show table status from oa SELECT TABLE_SCHEMA 数据库, TABLE_NAME 表, COLUMN_NAME 字段, CHARACTER_SET_NAME 原字符集, COLLATION_NAME 原排序规则, CONCAT( ALTER TABLE , TABLE_SCHEMA, ., TABLE_NAME, MODIFY COLUMN , COLUMN_NAME, , COLUMN_TYPE, CH…

Spring Bean自动装配:深入解析与实战应用

何为自动装配 在使用Spring框架配置bean时&#xff0c;我们通常需要为bean的属性设置值。如果不手动设置这些值&#xff0c;它们通常会被初始化为默认值&#xff08;对于对象类型通常是null&#xff0c;对于基本类型如int则是0&#xff0c;boolean是false等&#xff09;。自动…

hevc和H.264格式的区别

HEVC&#xff08;High Efficiency Video Coding&#xff09;和H.264&#xff08;也称为Advanced Video Coding&#xff0c;AVC&#xff09;都是视频压缩标准&#xff0c;但它们之间存在一些显著的区别&#xff0c;主要集中在压缩效率、资源需求和兼容性方面。 压缩效率 HEVC&am…

python2进制移位>>><<<

1.右移动 对于正数&#xff0c;右边舍弃&#xff0c;左边补零 对于负数&#xff0c;右边舍弃&#xff0c;左边补1 2.左移动<< 运算符将一个数的二 进制位向左移动指定的位数&#xff0c;右边用 0 填充。例如&#xff0c;将数字 5&#xff08;二进制表示为 101&#xf…

Gitee的基本使用方法和基本用法

Gitee是一个类似于GitHub的代码托管和协作平台&#xff0c;用于管理、分享和合作开发项目。下面是Gitee的使用方法和基本用法&#xff1a; 注册和登录&#xff1a; 首先&#xff0c;你需要在Gitee上注册一个账号。注册完成后&#xff0c;使用你的账号登录。 创建仓库&#xff…

(超详细)YOLOV7改进-Soft-NMS(支持多种IoU变种选择)

1.在until/general.py文件最后加上下面代码 2.在general.py里面找到这代码&#xff0c;修改这两个地方 3.之后直接运行即可

网页设计软件Bootstrap Studio6.7.1

Bootstrap Studio是一个适用于Windows的程序,允许您使用流行的fre***orca Bootstrap创建和原型网站。您可以将现成的组件拖动到工作区并直观地自定义它们。该程序生成干净和语义的PDF、CSS和JS代码,所有Web浏览器都支持这些代码。 Bootstrap Studio有一个漂亮而强大的界面,它…

DataWorks重磅推出全新资源组2.0,实现低成本灵活付费和动态平滑扩缩容

背景简介 DataWorks资源组为DataWorks上的各个功能模块提供计算资源&#xff0c;属于付费服务。 资源组属于DataWorks的基础组件&#xff0c;是客户正常使用DataWorks的前提。 资源组直接影响到相关功能是否正常运行&#xff0c;以及运行的效率和稳定性。 此前DataWorks资源…

ImportError: attempted relative import beyond top-level package报错,解决方法

1.如下图所示&#xff0c;在conftest.py页面采用相对路径去引用包&#xff0c;运行提示报错信息 目录结构: D:. ├─common ├─config ├─image ├─logFile ├─page │ └─basePage.py └─test_cases└─conftest.py从目录结构中我们可以看到conftest.py文件和basePage…

IDM下载管理器的优势分析:为什么选择IDM?

在互联网日益普及的今天,下载管理器成为了我们日常生活中必不可少的工具。无论是下载软件、音乐、视频,还是大文件,下载管理器都能大大提升效率和体验。IDM(Internet Download Manager)作为全球范围内广受欢迎的下载管理器之一,凭借其出色的功能和性能,赢得了广大用户的…

【杂记-浅谈DHCP动态主机配置协议】

DHCP动态主机配置协议 一、DHCP概述1、定义2、作用3、报文类型 二、DHCP的工作原理三、DHCP服务器的配置和管理 一、DHCP概述 1、定义 DHCP&#xff0c;Dynamic Host Configuration Protocol&#xff0c;动态主机配置协议&#xff0c;是一种网络协议&#xff0c;主要用于在IP…

如何免费的去使用connectedpapers?

免费使用connectedpapers 1. 打开谷歌浏览器2. 按住ctrlshiftN,进入无痕模式3. 不需要登录&#xff08;也就是访客模式&#xff09;4. 两次用完&#xff0c;关闭无痕模式&#xff08;继续重复步骤 2 - 4&#xff09; 1. 打开谷歌浏览器 2. 按住ctrlshiftN,进入无痕模式 输入网…

使用Github API获取排名

看到有人使用Github 提供的API做了GitHub rank的网站&#xff0c;由于以前没有使用过Github的API&#xff0c;所以打算自己动手尝试一下。在线效果 1. Token 生成 使用API前需要先申请开发者Token&#xff0c;在Settings --> Developer settings --> Personal access t…