EF Core与ASP.NET Core的集成

devtools/2025/2/4 7:56:34/

目录

分层项目中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/devtools/155946.html

相关文章

在CentOS服务器上部署DeepSeek R1

在CentOS服务器上部署DeepSeek R1,并通过公网IP与其进行对话,可以按照以下步骤操作: 一、环境准备 系统要求: CentOS 8+(需支持AVX512指令集)。 硬件配置: GPU版本:NVIDIA驱动520+,CUDA 11.8+。 CPU版本:至少16核处理器,64GB内存。 存储空间:原始模型需要30GB,量…

【JAVA篇】------ spring aop

文章目录 AOP&#xff08;面向切面编程&#xff09;前言一、AOP的概念二、AOP的核心概念三、AOP在Java中的应用场景1. 整体介绍2. 静态代理模式3. 动态代理模式&#xff08;JDK动态代理&#xff09; 总结 AOP&#xff08;面向切面编程&#xff09; &#x1f4ac;欢迎交流&#…

Deep Crossing:深度交叉网络在推荐系统中的应用

实验和完整代码 完整代码实现和jupyter运行&#xff1a;https://github.com/Myolive-Lin/RecSys--deep-learning-recommendation-system/tree/main 引言 在机器学习和深度学习领域&#xff0c;特征工程一直是一个关键步骤&#xff0c;尤其是对于大规模的推荐系统和广告点击率预…

无人机图传模块 wfb-ng openipc-fpv,4G

openipc 的定位是为各种模块提供底层的驱动和linux最小系统&#xff0c;openipc 是采用buildroot系统编译而成&#xff0c;因此二次开发能力有点麻烦。为啥openipc 会用于无人机图传呢&#xff1f;因为openipc可以将现有的网络摄像头ip-camera模块直接利用起来&#xff0c;从而…

【大数据技术】教程01:搭建完全分布式高可用大数据集群(VMware+CentOS+FinalShell)

搭建完全分布式高可用大数据集群&#xff08;VMwareCentOSFinalShell&#xff09; 资源下载 VMware Workstation Pro 16CentOS-Stream-10-latest-x86_64-dvd1.isoFinalShell 4.5.12 注&#xff1a;请在阅读本篇文章前&#xff0c;将以上资源下载下来。 写在前面 本章主要介…

7.抽象工厂(Abstract Factory)

抽象工厂与工厂方法极其类似&#xff0c;都是绕开new的&#xff0c;但是有些许不同。 动机 在软件系统中&#xff0c;经常面临着“一系列相互依赖的对象”的创建工作&#xff1b;同时&#xff0c;由于需求的变化&#xff0c;往往存在更多系列对象的创建工作。 假设案例 假设…

求水仙花数,提取算好,打表法。或者暴力解出来。

暴力解法 #include<bits/stdc.h> using namespace std; int main() {int n,m;cin>>n>>m;if(n<3||n>7||m<0){cout<<"-1";return 0;}int powN[10];//记录0-9的n次方for(int i0;i<10;i){powN[i](int)pow(i,n);}int low(int) pow(1…

七. Redis 当中 Jedis 的详细刨析与使用

七. Redis 当中 Jedis 的详细刨析与使用 文章目录 七. Redis 当中 Jedis 的详细刨析与使用1. Jedis 概述2. Java程序中使用Jedis 操作 Redis 数据2.1 Java 程序使用 Jedis 连接 Redis 的注意事项2.2 Java程序通过 Jedis当中操作 Redis 的 key 键值对2.3 Java程序通过 Jedis 当中…