.Net Core Entity Framework Core 的基础封装
上篇讲到 c# Unit of Work 知识分享时,对于创建DBContext 的封装没有讲到,这次分享跟大家

public interface IDbContextFactory
{
DbContext CreateDbContext(string connectionString);
} /// <summary>
/// 这里实现的思路是根据用户输入的代码来决定链接的是哪个数据库,从而实现数据库多租户的方式
/// DbContextFactory 将能够在一个请求周期内创建并复用单个 DbContext 实例
/// </summary>
public class DbContextFactory : IDbContextFactory
{
private readonly IServiceScopeFactory _scopeFactory;
private DbContext _dbContext;
public DbContextFactory(IServiceScopeFactory scopeFactory)
{
_scopeFactory = scopeFactory;
}
public DbContext CreateDbContext(string connectionString)
{
if (_dbContext != null)
{
return _dbContext;
} if (string.IsNullOrEmpty(connectionString))
{
throw new InvalidOperationException("链接字符串是空的...");
} var scope = _scopeFactory.CreateScope();
var optionsBuilder = new DbContextOptionsBuilder<NoteDbContext>();
optionsBuilder.UseMySql(connectionString, new MySqlServerVersion(new Version()));
optionsBuilder.AddInterceptors(new LoggingInterceptor());
_dbContext = new NoteDbContext(optionsBuilder.Options); return _dbContext;
}
}
IDbContextFactory接口和实现
到这里我查了一些资料,得出了在.netcore中直接使用AddDbContext 与使用我封装的DbContextFactory 区别说明,如果有错误,请各位指正

/*
使用 AddDbContext
当使用 AddDbContext 方法注册 DbContext 时:
生命周期管理:ASP.NET Core DI 容器自动处理 DbContext 的生命周期。通常,DbContext 是作为 Scoped 服务注册的,这意味着每个 HTTP 请求都会创建一个新的 DbContext 实例,并且在请求结束时自动释放。
配置简化:AddDbContext 提供了一个地方来配置数据库连接和其他选项,使得配置更集中和一致。
集成:这种方式与 ASP.NET Core 的其他功能(如中间件、过滤器、控制器等)紧密集成,允许在这些组件中通过构造函数注入轻松获取 DbContext 实例。
连接池:对于某些数据库提供程序(如 SQL Server),AddDbContext 允许使用连接池(通过 AddDbContextPool 方法),这可以提高性能,因为它重用连接实例而不是每次都创建新的。
例子: builder.Services.AddDbContext<NoteDbContext>(options =>
options.UseMySql(
builder.Configuration.GetConnectionString("YourConnectionStringName"),
new MySqlServerVersion(new Version())
)
); 使用 DbContextFactory
当手动创建 DbContextFactory 并使用它来创建 DbContext 实例时:
控制:对 DbContext 的创建有更多的控制,可以在需要的时候创建和释放 DbContext,而不是依赖于请求的生命周期。
灵活性:这种方法在某些特殊场景下很有用,比如在 Singleton 服务中需要使用 DbContext,或者在非 HTTP 请求的环境(如后台任务)中需要创建 DbContext。
手动管理:需要手动管理 DbContext 的生命周期,包括创建、使用和释放。
复杂性:相比于 AddDbContext,手动创建 DbContext 可能会增加代码的复杂性和出错的可能性。
例子: public class DbContextFactory : IDbContextFactory
{
// ... 实现 DbContextFactory 的代码 ...
}
builder.Services.AddScoped<IDbContextFactory, DbContextFactory>(); 总结
如果应用程序遵循标准的 ASP.NET Core 请求处理模式,并且希望利用框架提供的便利性和集成,那么使用 AddDbContext 是更好的选择。
如果需要在不同的环境中创建 DbContext,或者需要更细粒度的控制 DbContext 的创建和销毁,那么使用 DbContextFactory 可能更合适。
在大多数情况下,推荐使用 AddDbContext 方法,因为它简化了配置和管理,同时提供了与 ASP.NET Core 框架的紧密集成。只有在特定场景下,当标准方法不满足需求时,才考虑使用 DbContextFactory。
*/
AddDbContext 与DbContextFactory 区别说明

public class NoteDbContext : DbContext
{
public NoteDbContext(DbContextOptions<NoteDbContext> options)
: base(options)
{ }
public NoteDbContext(DbContextOptions<DbContext> options)
: base(options)
{ }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
/*
1.安装 Microsoft.EntityFrameworkCore.Proxies 包。
2.在 OnConfiguring 方法或在设置 DbContextOptionsBuilder 时调用 UseLazyLoadingProxies()。
3.导航属性必须是 virtual,这样代理才能重写它们。
4.实体类不能是 sealed,因为代理需要派生自它们。*/ /*
延迟加载可以使初始查询更快,因为它不会加载所有相关的数据。
然而,如果不当使用,它可能会导致 N+1 查询问题,这是指每次访问导航属性时都会执行一个新的数据库查询,
这可能会在不经意间导致大量的数据库请求,从而影响应用程序的性能。 因此,当使用延迟加载时,应该注意:
确保了解何时会触发延迟加载。
在性能敏感的代码路径中,可能需要显式地预加载(eager load)相关数据,以避免 N+1 查询问题。
监控和优化数据库查询,以确保应用程序的性能。*/
optionsBuilder.UseLazyLoadingProxies();
//base.OnConfiguring(optionsBuilder);
}
public DbSet<PrincipalInfo> PrincipalInfoDbSet { get; set; }
}
DbContext的具体配置
.Net Core Entity Framework Core 的基础封装的更多相关文章
- ABP 教程文档 1-1 手把手引进门之 ASP.NET Core & Entity Framework Core(官方教程翻译版 版本3.2.5)
本文是ABP官方文档翻译版,翻译基于 3.2.5 版本 官方文档分四部分 一. 教程文档 二.ABP 框架 三.zero 模块 四.其他(中文翻译资源) 本篇是第一部分的第一篇. 第一部分分三篇 1- ...
- NET Core & Entity Framework Core
ABP 教程文档 1-1 手把手引进门之 ASP.NET Core & Entity Framework Core(官方教程翻译版 版本3.2.5) 本文是ABP官方文档翻译版,翻译基于 ...
- ASP.NET Core 入门教程 8、ASP.NET Core + Entity Framework Core 数据访问入门
一.前言 1.本教程主要内容 ASP.NET Core MVC 集成 EF Core 介绍&操作步骤 ASP.NET Core MVC 使用 EF Core + Linq to Entity ...
- ASP.NET Core 入门笔记9,ASP.NET Core + Entity Framework Core 数据访问入门
一.前言 1.本教程主要内容 ASP.NET Core MVC 集成 EF Core 介绍&操作步骤 ASP.NET Core MVC 使用 EF Core + Linq to Entity ...
- 尝试.Net Core—使用.Net Core + Entity FrameWork Core构建WebAPI(一)
想尝试.Net Core很久了,一直没有时间,今天回家,抛开一切,先搭建一个.Net Core的Demo出来玩玩. 废话少说,咱直奔主题: 一.开发环境 VS2015 Update3 Microsof ...
- .net core Entity Framework Core Code First 框架 分层开发
由于之前苦于无法把 Entityframework 跟Web层剥离.找了很久..找到了这个框架..分享给大家.. GitHub 地址:https://github.com/chsakell/dotn ...
- asp.net core + entity framework core 多数据库类型支持实战
根据微软官方文档的说法,有两种方法可以实现在一个app中同时适应多种不同类型的数据库,并且全部支持migrations操作.其一,使用两个dbcontext:其二,修改migration文件,添加特定 ...
- ASP.NET Core 配置 Entity Framework Core - ASP.NET Core 基础教程 - 简单教程,简单编程
原文:ASP.NET Core 配置 Entity Framework Core - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 配置 Entity Fram ...
- 001从零开始入门Entity Framework Core——基础知识
Entity Framework (EF) Core 是轻量化.可扩展.开源和跨平台版的常用 Entity Framework 数据访问技术. 一.什么是 Entity Framework Core ...
- Entity Framework Core 1.1 Preview 1 简介
实体框架核心(EF Core)是Entity Framework的一个轻量级,可扩展和跨平台版本. 10月25日,Entity Framework Core 1.1 Preview 1发布了. 升级到 ...
随机推荐
- [转帖]Tomcat部署及优化
目录 一.Tomcat简介 1 Tomcat的三大核心组件 2 Java Servlet 3 JSP全称Java Server Pages 4 Tomcat 功能组件结构 5 Tomcat 请求过程 ...
- [转帖]Zookeeper集群搭建(3个节点为例)
Zookeeper集群搭建 1.说明 本文用的linux版本:centos6,准备3台centos6虚拟机,给他们安装zookeeper,每一台的安装过程相同,你也可以安装一台,然后克隆出另外两台.主 ...
- [转帖]jmeter_采样器sampler简介
1.取样器介绍 取样器是用来模拟用户操作的,向服务器发送请求以及接收服务器的响应数据. 取样器是在线程组内部的元件,也就是说取样器只能在线程组中添加. 取样器(Sampler)是性能测试中向服务器发送 ...
- [转帖]xsos:一个在 Linux 上阅读 SOSReport 的工具
https://www.sohu.com/a/315931829_100034897 xsos 是一个帮助用户轻松读取 Linux 系统上的 sosreport 的工具.另一方面,我们可以说它是 so ...
- [转帖]Linux系统硬链接和软链接具体实例讲解(超详细)
简介 在 Linux 中,元数据中的 inode 号(inode 是文件元数据的一部分但其并不包含文件名,inode 号即索引节点号)才是文件的唯一标识而非文件名.文件名仅是为了方便人们的记忆和使用, ...
- [转帖]整理常用的 vim 命令
vim 是一款功能强大的文本编辑器,它是Linux下常用的编辑器之一,对于熟练掌握了 vim 的人来说,用它编辑文件,方便又快捷,能极大的提高工作效率 vim 功能强大,对应的命令也非常的多,对于初学 ...
- element-ui表格展开行每次只能展开一行
element-ui表格展开行每次只能展开一行 <template> <el-table :data="tableData" :expand-row-keys=& ...
- 【JS 逆向百例】某公共资源交易网,公告 URL 参数逆向分析
声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 逆向目标 目标:某地公共资 ...
- linux如何配置ssh密钥登录
为什么要用ssh密钥登录 购买的服务器设置密码很容易被暴力破解,用密钥登录安全很多.root用户新建的用户也要用密钥登录更安全,如果一直su - 用户名登录 不方便 用xftp等服务上传文件到用户使用 ...
- Gorm日志设置
Logger Gorm提供了一个默认的logger实现,默认情况下日志数据级别为warn,同时输出慢SQL: Default = New(log.New(os.Stdout, "\r\n&q ...