首页 > 其他分享 >.Net Core Entity Framework Core 的基础封装

.Net Core Entity Framework Core 的基础封装

时间:2024-02-22 13:45:01浏览次数:29  
标签:Core DbContext DbContextFactory Framework AddDbContext new Entity public

上篇讲到  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的具体配置

 

标签:Core,DbContext,DbContextFactory,Framework,AddDbContext,new,Entity,public
From: https://www.cnblogs.com/INetIMVC/p/18027155

相关文章

  • .net core di ioc
    (DependencyInjection,DI)依赖注入,又称依赖关系注入,是一种软件设计模式,也是依赖倒置原则的一种体现。依赖倒置原则的含义如下上层模块不依赖下层模块。二者都依赖抽象抽象不依赖细节细节依赖抽象依赖注入原则有别于传统的通过关键字new直接依赖下层模块的形式,以第三方容器......
  • 改造Aforge.Video在.NetCore中使用
    Aforge.Video是可以方便获取摄像头等视频输入设备图像的轻量级组件,但是该组件的最新版本2.2.5大约是在2013年发布的,仅支持.NetFramework,在基于.Net6的Winform中无法使用。Aforge.Video组件存在开源项目AForge.NET中,该项目有1kStars(2024.02)。本文的改造思想是将项目中使......
  • .net core 读取appsetting.json 封装
    /*需要引入的包Microsoft.Extensions.Configuration-提供配置的核心功能。Microsoft.Extensions.Configuration.Json-支持从JSON文件加载配置。Microsoft.Extensions.Configuration.FileExtensions-支持文件相关的配置,如设置基路径。Microsoft.Extensions.Configura......
  • 如何让.NET Core支持GB2312和GBK
    在.NETCore中,默认是不支持GB2312和GBK编码的。若果强制使用Encoding.GetEncoding(“GB2312”)的时候会抛出异常。所以在.NETCore中如果我们要使用GB2312和GBK编码,需要给项目引入一个Nuget包:包安装可以使用以下方法来添加System.Text.Encoding.CodePages:VisualStudio......
  • home-assistant core 源码粗读--对设备历史的处理(三)
    我们已经知道User等保存是直接以json的形式直接保存到文件中。先说结论:设备的检测历史默认保存在sqlite中Thedefault,andrecommended,databaseengineis SQLite whichdoesnotrequireanyconfiguration.ThedatabaseisstoredinyourHomeAssistantconfigurati......
  • home-assistant core 源码粗读--如何管理多用户-用户存储(二)
    程序中搜索User, 很容易命中homeassistant/auth/models.py程序中大量使用了attr.s进行模型的声明。上篇说过dataclass,以及BaseModel,区别见: https://www.modb.pro/db/412679文件中定义了5个模型,这里只需要猜测他们的意思即可,这里重点分析User。程序中搜索User, 很容易命......
  • home-assistant core 源码粗读--程序入口篇(一)
    core源码地址:https://github.com/home-assistant/core/tree/mastercore与其他container等版本区别见: https://www.home-assistant.io/installation/入口:homeassisstant/__main__.py   难点: faulthandler【错误记录的包,C语言编写】,  parser.add_mutually_exclusi......
  • 用 C# framework2.0 写一个电脑安全扫描
    编写一个电脑安全扫描工具是一个相对复杂的任务,因为它需要涉及到很多不同的方面,如系统监控、进程分析、文件扫描、注册表检查等。在C#中,.NETFramework2.0提供了很多类库,可以用来构建这样的工具,但它并不是为此目的而专门设计的。在较新的.NET版本中,例如.NETCore或.NET5/6,会有......
  • 使用NSSM 把 .net core 开发的控制台程序部署成windows 服务
    0.背景应工作需要需要写个对指定网站附件进行监控,发现有新附件时需要程序进行自动下载,程序设计使用技术如下:开发语言:.net8C# 定时任务:Quartzhttp请求和下载:HttpClienthtml解析:HtmlAgilityPack服务部署工具:NSSM 1.什么是NSSM在windows平台NSSM可以把bat、exe等文件......
  • 用 C# framework2.0 写一个检查电脑是否有漏洞的程序
    编写一个检查电脑是否有漏洞的程序是一个复杂的任务,因为漏洞检测通常涉及到深入分析操作系统、应用程序和它们的配置。此外,真正的漏洞扫描工具通常需要使用专门的漏洞数据库和签名来识别已知的安全问题。在.NETFramework2.0中,并没有直接提供这样的功能。然而,你可以编写一个简化......