EF Core与ASP.NET Core的集成

server/2025/2/3 18:07:07/

目录

分层项目中EF Core的用法

数据库的配置

数据库迁移

步骤汇总

注意:

批量注册上下文


分层项目中EF Core的用法

  1. 创建一个.NET类库项目BooksEFCore,放实体等类。
  2. NuGet:Microsoft.EntityFrameworkCore.Relational
  3. BooksEFCore中增加实体类Book和配置类。

数据库的配置

  1. 上下文类MyDbContext :为什么正式项目中最好不要在MyDbContext写数据库配置(连接不同的DB甚至不同类型的DB)。尽量数据库配置的代码写到ASP.NET Core项目中。不重写OnConfiguring方法,而是为MyDbContext类的构造方法增加DbContextOptions<MyDbContext>参数。在ASP.NET Core项目对DbContextOptions的配置。
  2. 创建ASP.NET Core项目,添加对“BooksEFCore”项目的引用。NuGet安装Microsoft.EntityFrameworkCore.SqlServer。
  3. 配置文件、配置代码等放到ASP.NET Core项目中。
MyDbContext:
public class MyDbContext : DbContext
{public DbSet<Book> Books { get; set; }public MyDbContext(DbContextOptions<MyDbContext> options) : base(options){}protected override void OnModelCreating(ModelBuilder modelBuilder){base.OnModelCreating(modelBuilder);modelBuilder.ApplyConfigurationsFromAssembly(this.GetType().Assembly);}
}secrets.json:
{"ConnStr": "Data Source=.;Initial Catalog=demo1;Integrated Security=SSPI;TrustServerCertificate=true;"
}Program.cs:
builder.Services.AddDbContext<MyDbContext>(opt =>
{string connStr = builder.Configuration.GetSection("ConnStr").Value;opt.UseSqlServer(connStr);
});Controller:
private readonly MyDbContext dbCtx;
public TestController(MyDbContext dbCtx)
{this.dbCtx = dbCtx;
}

数据库迁移

  1. 不用研究多项目中Add-Migration的细节。实用的方案:编写实现IDesignTimeDbContextFactory接口的类,把配置放到里面,反正是开发环境用而已。
  2. 可以把连接字符串配置到环境变量中,不过MyDesignTimeDbContextFactory中很难使用IConfiguration来读取配置系统,可以直接用Environment.GetEnvironmentVariable() 读取环境变量。
  3. 数据库迁移脚本要生成到BooksEFCore中,因此为这个项目安装Microsoft.EntityFrameworkCore.Tools、Microsoft.EntityFrameworkCore.SqlServer。然后把BooksEFCore设置为启动项目,并且在【程序包管理器控制台】中也选中BooksEFCore项目后,执行Add-Migration和Update-Database
internal class MyDesignTimeDbContextFactory : IDesignTimeDbContextFactory<MyDbContext>
{//开发时(Add-Migration、Update-Database等)运行的数据库上下文工厂public MyDbContext CreateDbContext(string[] args){DbContextOptionsBuilder<MyDbContext> optionsBuilder = new DbContextOptionsBuilder<MyDbContext>();string connStr = Environment.GetEnvironmentVariable("ConnStr");optionsBuilder.UseSqlServer(connStr);MyDbContext dbCtx = new MyDbContext(optionsBuilder.Options);return dbCtx;}
}

步骤汇总

  1. 建类库项目,放实体类、DbContext、配置类等;DbContext中不配置数据库连接,而是为DbContext增加一个DbContextOptions类型的构造函数。
  2. EFCore项目安装对应数据库的EFCore Provider
  3. asp.net core项目引用EFCore项目,并且通过AddDbContext来注入DbContext及对DbContext进行配置。
  4. Controller中就可以注入DbContext类使用了。
  5. 让开发环境的Add-Migration知道连接哪个数据库,在EFCore项目中创建一个实现了IDesignTimeDbContextFactory的类。并且在CreateDbContext返回一个连接开发数据库的DbContext。
    如果不在乎连接字符串被上传到Git,就可以把连接字符串直接写死到CreateDbContext;如果在乎,那么CreateDbContext里面很难读取到VS中通过简单的方法设置的环境变量,所以必须把连接字符串配置到Windows的正式的环境变量中,然后再 Environment.GetEnvironmentVariable读取。
  6. 正常执行Add-Migration、Update-Database迁移就行了。需要把EFCore项目设置为启动项目,并且在【程序包管理器控制台】中也要选中EFCore项目,并且安装Microsoft.EntityFrameworkCore.SqlServer、Microsoft.EntityFrameworkCore.Tools

注意:

配置完环境变量需重启VS

批量注册上下文

如果项目采用小上下文策略,在项目中可能就存在多个上下文类,需要手动调用AddDbContext方法注册,如果上下文连接的是同一个数据库,可以采用反射的方式扫描程序集中所有的上下文,然后为它们逐个调用AddDbContext注册。

Add-Migration xxx -Context DbContext名

Update-Database -Context DbContext名

Install-Package Zack.Infrastructure

//var asms=new Assembly[] {Assembly.Load("EFCoreBooks") };
var asms= ReflectionHelper.GetAllReferencedAssemblies();
builder.Services.AddAllDbContexts(opt =>
{string connStr = builder.Configuration.GetSection("ConnStr").Value;opt.UseSqlServer(connStr);
}, asms);public record Person
{public long Id { get; set; }public string Name { get; set; }public int Age { get; set; }public string Address { get; set; }
}public class PersonDbContext : DbContext
{public DbSet<Person> Persons { get; set; }public PersonDbContext(DbContextOptions<PersonDbContext> options) : base(options){}
}internal class PersonDesignTimeDbContextFactory : IDesignTimeDbContextFactory<PersonDbContext>
{public PersonDbContext CreateDbContext(string[] args){DbContextOptionsBuilder<PersonDbContext> optionsBuilder = new DbContextOptionsBuilder<PersonDbContext>();string connStr = Environment.GetEnvironmentVariable("ConnStr");optionsBuilder.UseSqlServer(connStr);PersonDbContext dbCtx = new PersonDbContext(optionsBuilder.Options);return dbCtx;}
}


http://www.ppmy.cn/server/164671.html

相关文章

论文阅读:Realistic Noise Synthesis with Diffusion Models

这篇文章是 2025 AAAI 的一篇工作&#xff0c;主要介绍的是用扩散模型实现对真实噪声的仿真模拟 Abstract 深度去噪模型需要大量来自现实世界的训练数据&#xff0c;而获取这些数据颇具挑战性。当前的噪声合成技术难以准确模拟复杂的噪声分布。我们提出一种新颖的逼真噪声合成…

数据库、数据仓库、数据湖有什么不同

数据库、数据仓库和数据湖是三种不同的数据存储和管理技术&#xff0c;它们在用途、设计目标、数据处理方式以及适用场景上存在显著差异。以下将从多个角度详细说明它们之间的区别&#xff1a; 1. 数据结构与存储方式 数据库&#xff1a; 数据库主要用于存储结构化的数据&…

【Leetcode 每日一题】119. 杨辉三角 II

问题背景 给定一个非负索引 r o w I n d e x rowIndex rowIndex&#xff0c;返回「杨辉三角」的第 r o w I n d e x rowIndex rowIndex 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 数据约束 0 ≤ r o w I n d e x ≤ 33 0 \le rowIndex \le 33 …

Linux学习之DNS基础服务器搭建

一、DNS服务器概述 1.dns服务主要的功能是将域名转换为相应的ip地址&#xff0c;提供dns服务的系统就是dns服务器 2.dns服务器分为3种&#xff1a; 主域名服务器&#xff1a;本身提供dns服务&#xff0c;不含区域数据文件 辅助域名服务器&#xff1a;和主域名服务器一起提供dns…

3D 对象的属性

JavaFX - Cull Face 属性 JavaFX 还为 3D 对象提供了各种属性。这些属性的范围包括确定形状的材料&#xff1a;内部和外部、渲染 3D 对象几何图形和剔除 3D 形状的面。 提供所有这些属性是为了即兴创作 3D 对象的外观和感觉;并检查适合应用程序的内容并应用它们。 Cull Face…

从0到1:C++ 开启游戏开发奇幻之旅(二)

目录 游戏开发核心组件设计 游戏循环 游戏对象管理 碰撞检测 人工智能&#xff08;AI&#xff09; 与物理引擎 人工智能 物理引擎 性能优化技巧 内存管理优化 多线程处理 实战案例&#xff1a;开发一个简单的 2D 射击游戏 项目结构设计 代码实现 总结与展望 游戏…

Visual Basic语言的云计算

以Visual Basic语言的云计算 引言 随着信息技术的快速发展&#xff0c;云计算已逐渐成为现代企业和个人用户的重要选择。它提供了高效、灵活和可扩展的计算资源&#xff0c;彻底改变了传统计算的模式。与此同时&#xff0c;Visual Basic&#xff08;VB&#xff09;作为一种易…

unity学习26:用Input接口去监测: 鼠标,键盘,虚拟轴,虚拟按键

目录 1 用Input接口去监测&#xff1a;鼠标&#xff0c;键盘&#xff0c;虚拟轴&#xff0c;虚拟按键 2 鼠标 MouseButton 事件 2.1 鼠标的基本操作 2.2 测试代码 2.3 测试情况 3 键盘Key事件 3.1 键盘的枚举方式 3.2 测试代码同上 3.3 测试代码同上 3.4 测试结果 4…