Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Entity Framework Core 总结

Entity Framework Core 总结

作者头像
yiyun
发布于 2022-04-01 08:23:44
发布于 2022-04-01 08:23:44
1.2K00
代码可运行
举报
文章被收录于专栏:yiyun 的专栏yiyun 的专栏
运行总次数:0
代码可运行

.NET Core CLI

此种方法对于 ASP.NET Core 也可以使用,其实当执行命令 dotnet ef migrations 时,会启动所在程序集(Program.cs),和正常启动ASP.NET Core 一样,所以会依赖注入 MyDbContext等

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 全局安装 EF Core 工具
dotnet tool install --global dotnet-ef

# 安装 设计包,这是对项目运行命令所必需的
dotnet add package Microsoft.EntityFrameworkCore.Design

# migrations 命令为迁移搭建基架,以便为模型创建一组初始表
dotnet ef migrations add InitialCreate

# database update 命令创建数据库并向其应用新的迁移
dotnet ef database update

dotnet ef migrations add InitialCreate 创建描述表结构的代码文件

EF Core 有两个工具集

  1. .NET Core 命令行接口 (CLI) 工具可用于 WindowsLinux 或 macOS。 这些命令以 dotnet ef 开头。
  2. 包管理器控制台 (PMC) 工具在 Windows 上的 Visual Studio 中运行。 这些命令以动词开头,例如 Add-MigrationUpdate-Database

为了跨平台 应用,同时也便于编写Shell脚本,建议使用 .NET Core CLI ,不依赖于 Visual Studio

在 ASP.NET Core 中初始化数据库

这是另一种创建表结构,初始化表数据的方式,而不是用CLI,这是在启动ASP.NET Core时执行。 用这种方法,无需 Migrations代码文件,也无需 b => b.MigrationsAssembly("WebApi") ,将在程序启动时,创建表结构(context.Database.EnsureCreated();),当然创建完表结构后,可以设定数据库种子(初始化表数据)

参考:ASP.NET Core 中的 Razor Pages 和 Entity Framework Core - 第 1 个教程(共 8 个) | Microsoft Docs

创建数据库

Program.cs

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using ContosoUniversity.Data;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using System;

namespace ContosoUniversity
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var host = CreateHostBuilder(args).Build();

            CreateDbIfNotExists(host);

            host.Run();
        }

        private static void CreateDbIfNotExists(IHost host)
        {
            using (var scope = host.Services.CreateScope())
            {
                var services = scope.ServiceProvider;
                try
                {
                    var context = services.GetRequiredService<SchoolContext>();
                    context.Database.EnsureCreated();
                    // DbInitializer.Initialize(context);
                }
                catch (Exception ex)
                {
                    var logger = services.GetRequiredService<ILogger<Program>>();
                    logger.LogError(ex, "An error occurred creating the DB.");
                }
            }
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });
    }
}

如果有上下文的数据库,则 EnsureCreated 方法不执行任何操作。 如果没有数据库,则它将创建数据库和架构。 EnsureCreated 启用以下工作流来处理数据模型更改:

  • 删除数据库。 任何现有数据丢失
  • 更改数据模型。 例如,添加 EmailAddress 字段。
  • 运行应用。
  • EnsureCreated 创建具有新架构的数据库。

在无需保存数据的情况下,当架构快速发展时,此工作流在早期开发过程中表现良好。 如果需要保存已输入数据库的数据,情况就有所不同了。 如果是这种情况,请使用迁移。

设定数据库种子

Data/DbInitializer.cs

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using ContosoUniversity.Data;
using ContosoUniversity.Models;
using System;
using System.Linq;

namespace ContosoUniversity.Data
{
    public static class DbInitializer
    {
        public static void Initialize(SchoolContext context)
        {
            context.Database.EnsureCreated();

            // Look for any students.
            if (context.Students.Any())
            {
                return;   // DB has been seeded
            }

            var students = new Student[]
            {
                new Student{FirstMidName="Carson",LastName="Alexander",EnrollmentDate=DateTime.Parse("2019-09-01")},
                new Student{FirstMidName="Meredith",LastName="Alonso",EnrollmentDate=DateTime.Parse("2017-09-01")},
                new Student{FirstMidName="Arturo",LastName="Anand",EnrollmentDate=DateTime.Parse("2018-09-01")},
                new Student{FirstMidName="Gytis",LastName="Barzdukas",EnrollmentDate=DateTime.Parse("2017-09-01")},
                new Student{FirstMidName="Yan",LastName="Li",EnrollmentDate=DateTime.Parse("2017-09-01")},
                new Student{FirstMidName="Peggy",LastName="Justice",EnrollmentDate=DateTime.Parse("2016-09-01")},
                new Student{FirstMidName="Laura",LastName="Norman",EnrollmentDate=DateTime.Parse("2018-09-01")},
                new Student{FirstMidName="Nino",LastName="Olivetto",EnrollmentDate=DateTime.Parse("2019-09-01")}
            };

            context.Students.AddRange(students);
            context.SaveChanges();
    }
}

Q&A

Q: EF Core 创建数据库 报错: 'Method 'Create' in type 'MySql.Data.EntityFrameworkCore.Query.Internal.My......

A: 降低设计器版本到 3.x

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="3.1.7">
    <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
    <PrivateAssets>all</PrivateAssets>
</PackageReference>

Q:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dotnet ef migrations add InitialCreate
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Your target project 'WebApi' doesn't match your migrations assembly 'Repositories'. Either change your target project or change your migrations assembly.
Change your migrations assembly by using DbContextOptionsBuilder. E.g. options.UseSqlServer(connection, b => b.MigrationsAssembly("WebApi")). By default, the migrations assembly is the assembly containing the DbContext.
Change your target project to the migrations project by using the Package Manager Console's Default project drop-down list, or by executing "dotnet ef" from the directory containing the migrations project.

A: WebApi.Startup.ConfigureServices

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
services.AddDbContext<RemDbContext>(options =>
	options.UseMySQL(connStr, b => b.MigrationsAssembly("WebApi")));

即, dotnet ef 的 默认 Migration 位于 DbContext 所在 Assembly,需要手动设置 MigrationsAssembly

WebApi 即 AssemblyName 可用下方代码获取

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
string migrationsAssembly = typeof(Startup).GetTypeInfo().Assembly.GetName().Name;

Q: 当多个 DbContext.Database.EnsureCreated() 时,只有第一个有效?

A: 是的,因为 EnsureCreated() 保证数据库被创建(存在),当第一个执行后,就会有数据库、表,

所以,当后面的 EnsureCreated() 执行时,由于已经存在数据库,所以不做任何操作

这个时候,只有对后面的调用 Migrate(),例如下方:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
this._applicationDbContext.Database.EnsureCreated();
this._configurationDbContext.Database.Migrate();
this._persistedGrantDbContext.Database.Migrate();

当然,也可以全部采用 Migrate():

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
this._applicationDbContext.Database.Migrate();
this._configurationDbContext.Database.Migrate();
this._persistedGrantDbContext.Database.Migrate();

注意:Migrate() 必须先生成 Migrations 代码文件,可使用 .NET CLI 生成:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dotnet ef migrations add InitialAspNetCoreIdentityDbMigration -c ApplicationDbContext -o Migrations/AspNetCoreIdentityDb

dotnet ef migrations add InitialIdentityServerPersistedGrantDbMigration -c PersistedGrantDbContext -o Migrations/IdentityServer/PersistedGrantDb

dotnet ef migrations add InitialIdentityServerConfigurationDbMigration -c ConfigurationDbContext -o Migrations/IdentityServer/ConfigurationDb

参考

感谢帮助!

本文作者: yiyun

本文链接: https://moeci.com/posts/分类-dotnet/dotnet-efcore/

版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-01-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
.NET Core1.1+VS2017RC+MySQL+EF搭建多层Web应用程序
新建.NET Core Web应用程序,【身份验证】需要选择【个人用户账户】否则无法执行migrations操作,猜想原因可能少了某个NuGet包,具体没去测试验证
星哥玩云
2022/07/11
3610
.NET Core1.1+VS2017RC+MySQL+EF搭建多层Web应用程序
面向初学者的 Entity Framework Core
实体框架核心(Entity Framework Core,简称EF Core)是一款适用于.NET应用程序的开源、轻量级且跨平台的对象关系映射器(Object-Relational Mapper,简称ORM)。它允许开发人员使用.NET对象来操作数据库,从而无需编写大多数SQL查询语句。EF Core通过对数据库交互的复杂性进行抽象,使得数据访问代码更易于维护、扩展和测试。
郑子铭
2025/02/18
1190
面向初学者的 Entity Framework Core
【One by One系列】IdentityServer4(八)使用EntityFramework Core对数据进行持久化
上几篇,我们创建了客户端,scope,启动时,IdentityServer把这些配置数据加载至内存,但是,如果我们想要更改配置,就必须停掉IdentityServer,然后重新启动。且IdentityServer在运行过程中还会生成临时数据,如授权码、是否同意的按钮选择、以及refresh token。默认情况下,这些也存储在内存中。
DDGarfield
2022/06/23
1.2K0
Entity Framework Core 2.0 使用代码进行自动迁移
一.前言 我们在使用EF进行开发的时候,肯定会遇到将迁移更新到生产数据库这个问题,前面写了一篇文章介绍了Entity Framework Core 2.0的入门使用,这里面介绍了使用命令生成迁移所需的SQL,然后更新到生产数据库的方法。这里还有另一种方法,就是利用EF Core自身所提供的方法来进行迁移。 二.API说明 这些方法都是DatabaseFacade的扩展方法,我们常使用的DbContext.Database就是DatabaseFacade类型。 GetMigrations 获取所有迁移 ///
晓晨
2018/06/22
1.1K0
Entity Framework Core 2.0 入门
LearnEf.Console依赖LearnEf.Domains和LearnEf.Data:
solenovex
2018/03/12
3.5K0
Entity Framework Core 2.0 入门
IdentityServer(14)- 使用EntityFramework Core配置和操作数据
IdentityServer具有良好的扩展性,其中一个可扩展点是用于IdentityServer所需数据的存储机制。 本快速入门介绍了如何配置IdentityServer以使用EntityFramework(EF)作为此数据的存储机制(而不是使用我们迄今为止使用的内存中实现)。 IdentityServer4.EntityFramework组件 有两种类型的数据需要持久化到数据库中。 首先是配置数据(资源和客户端),第二个是IdentityServer在使用时产生的操作数据(令牌,代码和同意书)。 这些存储
晓晨
2018/06/22
2K0
.NET EF Core(Entity Framework Core)
1、Entity Framework Core(EF Core)是微软官方的ORM框架。优点:功能强大、官方支持、生产效率高、力求屏蔽底层数据库差异;缺点:复杂、上手门槛高、不熟悉EFCore的话可能会进坑。 2、Dapper。优点:简单,N分钟即可上手,行为可预期性强;缺点:生产效率低,需要处理底层数据库差异。 3、EF Core是 模型驱动 (Model-Driven)的开发思想,Dapper是 数据库驱动(DataBase-Driven)的开发思想的。没有优劣,只有比较。 4、性能: Dapper等≠性能高;EF Core≠性能差。 5、EF Core是官方推荐、推进的框架,尽量屏蔽底层数据库差异,.NET开发者必须熟悉,根据的项目情况再决定用哪个。
鱼找水需要时间
2024/03/23
5470
.NET EF Core(Entity Framework Core)
Entity Framework Core-Migrations
使用EF Core Migrations可以使Entity & DbContext的配置与数据库保持一致,Migrations可以非常容易的将创建和更新数据库,当一个项目在开发过程中时,程序员能保证实体更新,因此他们需要运行Migration保证数据库是最新
郑子铭
2023/08/29
3810
Entity Framework Core-Migrations
使用Identity Server 4建立Authorization Server (5)
之前的配置都是在内存中, 下面将如何把这些数据存储到Sql Server数据库, 这样更适合生产环境. 这部分基本完全参考官方文档: https://identityserver4.readthedo
solenovex
2018/03/01
1.1K0
使用Identity Server 4建立Authorization Server (5)
WPF 运行时迁移 EF Core 数据库
在客户端开发,可以使用 .NET Core 3.0 开发 WPF 程序,可以使用 EF Core 连接数据库。客户端的数据库使用 SQLite 在不同的版本需要在客户端运行做数据库迁移升级数据库
林德熙
2019/10/09
1.3K0
【愚公系列】2023年02月 .NET/C#知识点-使用控制台手搭webapi框架
WebAPI是一种协议,用于允许网络应用程序(如浏览器)与网络服务器(如Web服务器)之间进行通信。它可以用于处理数据,访问数据库,处理图像和视频,以及进行其他高级功能。
愚公搬代码
2023/03/16
1.5K0
【愚公系列】2023年02月 .NET/C#知识点-使用控制台手搭webapi框架
【ASP.NET Core 基础知识】--Web API--创建和配置Web API(二)
集成Entity Framework Core(EF Core)是在ASP.NET Core Web API中进行数据库访问的常见方式。以下是集成EF Core的基本步骤:
喵叔
2024/05/24
3240
.NET Core 使用 EF 出错的解决方法
在.NET Core 项目钟(类库),使用Entity Framework,建立模型生成数据库时,失败
痴者工良
2019/08/08
2.8K0
【ASP.NET Core 基础知识】--数据库连接--数据迁移和代码优先开发
数据迁移是指将数据从一个存储系统、数据格式、应用程序或硬件平台转移到另一个的过程。这个过程可以涉及数据的转换、清洗和验证,以确保数据的完整性和一致性。一般用于如下情况:
喵叔
2024/05/24
2510
Entity Framework Core 2.1,添加种子数据
EFCore 2.1出来有一段时间了,里面的新功能还没怎么用,今天研究下如何使用EF Core 2.1添加种子数据。
solenovex
2018/12/04
1.7K0
Entity Framework Core 2.1,添加种子数据
IdentityServer4入门
IdentityServer4是用于ASP.NET Core的OpenID Connect和OAuth 2.0框架。
鱼找水需要时间
2023/02/16
7.8K0
Entity Framework Core 2.0 使用入门
一.前言 Entity Framework(后面简称EF)作为微软家的ORM,自然而然从.NET Framework延续到了.NET Core。以前我也嫌弃EF太重而不去使用它,但是EF Core(Entity Framework Core)已经做了很多性能优化,还有一些增加新特性,吸引了我去使用它。关于EF Core 2.0 的新特性请看:http://www.cnblogs.com/stulzq/p/7366044.html 二.控制台程序使用 EF Core(Code First) 1.新建一个.NE
晓晨
2018/06/22
1.2K0
ASP.NET Core快速入门(第6章:ASP.NET Core MVC)--学习笔记
课程链接:http://video.jessetalk.cn/course/explore
郑子铭
2021/01/13
2.3K0
ASP.NET Core快速入门(第6章:ASP.NET Core MVC)--学习笔记
从头编写 asp.net core 2.0 web api 基础框架 (4) EF配置
Github源码地址:https://github.com/solenovex/Building-asp.net-core-2-web-api-starter-template-from-scratch 前三部分弄完,我们已经可以对内存数据进行CRUD的基本操作,并且可以在asp.net core 2中集成Nlog了。 下面继续: Entity Framework Core 2.0 Entity Framework 是ORM(Object-Relational-Mapping)。ORM是一种让你可以使用面向
solenovex
2018/03/01
2.3K0
从头编写 asp.net core 2.0 web api 基础框架 (4) EF配置
浅析Entity Framework Core中的并发处理
本文讲述如何使用Entity Framework Core来实现一个乐观并发控制,并介绍在.NET Core中使用DbContext进行数据库操作时的一些常见问题和解决方案。
GuZhenYin
2018/01/04
2.8K0
浅析Entity Framework Core中的并发处理
推荐阅读
相关推荐
.NET Core1.1+VS2017RC+MySQL+EF搭建多层Web应用程序
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文