首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在服务中传递EF DbContext作为委托以附加所有更改是否是一种好做法

传递EF DbContext作为委托以附加所有更改是一种不推荐的做法。以下是详细解释:

EF DbContext是Entity Framework中的一个重要组件,用于管理数据库上下文和实体对象。在服务中传递EF DbContext作为委托,意味着将数据库上下文的控制权交给了服务的调用方。这种做法存在以下问题:

  1. 数据一致性问题:如果多个服务同时使用同一个DbContext实例,可能会导致数据一致性问题。因为每个服务都可以修改DbContext中的实体对象,而无法保证它们之间的操作顺序和一致性。
  2. 上下文生命周期管理问题:DbContext应该在每个请求或操作中具有短暂的生命周期,以确保资源的正确释放和垃圾回收。如果将DbContext传递给其他服务,就无法有效地管理其生命周期,可能会导致内存泄漏或资源浪费。
  3. 耦合度增加问题:将DbContext传递给其他服务会增加服务之间的耦合度。这样一来,如果需要更改数据库访问方式或切换到其他ORM框架,就需要修改所有使用该DbContext的服务,增加了维护和扩展的难度。

相反,推荐的做法是使用依赖注入(Dependency Injection)来管理DbContext的生命周期,并将其作为服务的依赖项进行注入。这样可以确保每个服务都有自己的DbContext实例,并且可以根据需要进行创建和销毁。通过依赖注入,可以更好地控制DbContext的生命周期,并减少耦合度。

对于EF DbContext的使用,可以考虑以下最佳实践:

  1. 使用短暂的DbContext生命周期:在每个请求或操作中创建一个新的DbContext实例,并在使用后及时释放资源。
  2. 使用依赖注入:通过依赖注入容器(如ASP.NET Core的内置容器或第三方容器)将DbContext注入到服务中,以确保每个服务都有自己的DbContext实例。
  3. 使用工作单元模式:将DbContext封装在工作单元中,以提供更高级别的事务管理和数据操作。
  4. 使用异步操作:EF提供了异步操作的支持,可以通过异步方式执行数据库操作,提高性能和响应性。

腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Entity Framework Core 2.0 新特性

使用所属类型与EF6使用复杂类型类似,(PS:这里解释一下EF6的复杂类型,复杂类型允许实体组织标量属性的实体类型的非标量属性。像实体一样,复杂类型由标量属性或其他复杂类型属性组成。)....性能提升方面 2.1DbContext连接池 ASP.NET Core程序我们使用EF Core一般都是将自定义DbContext类型注册到依赖注入系统,然后通过控制器的构造函数参数获取该类型的实例...这意味着为每个请求创建一个新的DbContext实例。 所以版本2.0,我们引入了一种依赖注入中注册自定义DbContext类型的新方式,它透明地引入了一个可重用的DbContext实例池。...显式编译的查询API已经以前版本的EF和LINQ to SQL可用,允许应用程序缓存查询的翻译,以便它们只能被计算一次并执行多次。...3.3FromSql和ExecuteSqlCommand的字符串插值 C#6(C#6.0特性请移步:这里)引入了字符串插值,这是一个允许C#表达式直接嵌入到字符串文字的功能,提供了一种在运行时构建字符串的方法

3.9K90

【源码解读(一)】EFCORE源码解读之创建DBContext查询拦截

Option的委托是否为null,如果不为null,那DBContext的构造函数必须要有一个参数,所以下面调用了一个方法CheckContextConstructors。...哈哈,不用猜,大家也知道,肯定是注入服务,通过options的Extensions附加一些其他关于EF的功能,并且将他们所需要的服务注入到传入的ServiceCollection里面,其他的都是一样,所以我们没有托管...,因为OptionsDbContextOptionsBuilder的内部字段可以更改的。...容器传入到EF里面去,这样EF注入的服务和Web注入的服务在一起的,然后调用UseInternalServiceProvider指定ServiceProvider就可以实现EF和WEB共用一个IOC...,我们一共讲了AddDbContext做了什么,DBContext的构造函数又做了那些事情,写了不托管EF的ioc到WEB的ioc的场景下如果注入服务EF的ioc,以及如何拦截增删改查的方式,提升查询性能的方式

80720
  • 生成数据库

    Dto与外界打交道的Model,entity则不一样,有一些Dto的计算属性我们并不像保存在数据库,所以entity没有这些属性;而数据从entity传递到Dto后某些属性也会和数据库里面的形式不一样...第一种MyContextoverride OnConfiguring这个方法: namespace CoreBackend.Api.Entities { public class MyContext...但是项目中如果有很多entities的话也需要写很多行代码,更好的做法写一个方法,可以加载所有实现了IEntityTypeConfiguration的实现类。...本地开发的时候还没有什么问题(使用的集成验证),但是你要部署到服务器的时候,数据库连接字符串可能包括用户名和密码(Sql Server的另一种验证方式)。...然后把系统环境变量的连接字符串删了把,并且把项目属性Debug改成Development,这时候需要重启VS,因为一般环境变量软件启动的时候附加到其内存的,软件没关的情况下如果把系统环境变量给删了

    1K20

    从头编写 asp.net core 2.0 web api 基础框架 (4) EF配置

    Dto与外界打交道的Model,entity则不一样,有一些Dto的计算属性我们并不像保存在数据库,所以entity没有这些属性;而数据从entity传递到Dto后某些属性也会和数据库里面的形式不一样...第一种MyContextoverride OnConfiguring这个方法: namespace CoreBackend.Api.Entities { public class MyContext...但是项目中如果有很多entities的话也需要写很多行代码,更好的做法写一个方法,可以加载所有实现了IEntityTypeConfiguration的实现类。...本地开发的时候还没有什么问题(使用的集成验证),但是你要部署到服务器的时候,数据库连接字符串可能包括用户名和密码(Sql Server的另一种验证方式)。...然后把系统环境变量的连接字符串删了把,并且把项目属性Debug改成Development,这时候需要重启VS,因为一般环境变量软件启动的时候附加到其内存的,软件没关的情况下如果把系统环境变量给删了

    2.3K70

    EF 数据库连接约定(Connection String Conventions in Code First)

    (给定连接字符串) (2)、上下文通过Code First语法计算模型还是使用EF 设计器 (3)、额外的高级选项 下面DbContext构造器的常用的用途: 一、DbContext无参构造函数 如果当前...EF应用没有做任何的配置.且在你自定义的数据库上下文类没有调用DbContext带参的构造函数,那么当前应用对应的数据库上下文类,将会调用DbContext的默认无参的构造函数(EF默认规定的数据库连接...注:VS2010默认安装SQL Express,VS2012默认安装LocalDb,安装过程,EF NuGet包会检查哪个数据库服务(前面介绍的)可用,当EF创建默认连接的时候,当EF创建默认链接的时候...,NuGet包将通过设置默认的Code First数据库服务器来更新配置文件,该数据库服务通过约定创建连接时首先使用该服务器。....另外一种方式传递DbContext构造函数配置文件的connectionString节点的name属性来指定上下文通过配置文件connectionString来连接字符串,代码如下: public

    1.4K90

    Repository个人实践

    泛型IRepository接口用来规范所有仓储都应该具有的基础增删查改方法,这里有2点需要注意: 1)方法返回类型为IQueryable,目的延迟查询,用过类似EF的ORM的应该都知道; 2)接口有个泛型参数...答案来了,这里有个小技巧,既然我们都明白,自定义服务可以注册为接口或基类的,那这里我们把XXXDBContext也当做自定义服务来注册,你前面不是EF标准注册了XXDBContext了么,,下一步,...注意,这一步比较重要,因为它直接决定了你EFUnityOfWork是否能接收到DBContext,不这样做,你就得EFUnityOfWork中直接接受XXDBContext了,那还谈何抽象,还谈何基础架构...另外,涉及到多ORM或切换ORM,直接更改不推荐,锅锅们,面向对象或者抽象的目的,不是为了改动,而是为了扩展,我上边只是为了说明要基于其他ORM去实现,非常简单而已,正确做法,直接新建Account.Infrustructure.Chloe...另外,之前曾有园友问过,Autofac模块化注入,如果不想名字结尾来匹配,如何注册服务或仓储,这里也贴出解决方案: public class RepositoryModule : Module

    1K20

    EF 相见恨晚的Attach方法

    一个偶然的机会,让我注意了EF 的Attach方法,于是深入了解让我大吃一惊 我所参与的项目中所有的更新操作与删除操作都是把原对象加载出来后,再做处理,然后再保存到数据库,这样的操作不缺点在于每一次的操作都要对数据库进行两次操作...,性能上有很大的问题, 于是Attach方法出场 介绍Attach方法前先介绍与它相关的知识点   Attach方法:将给定实体 System.Data.EntityState.Unchanged...状态附加到上下文中 从解释可以看出Attach方法主要目的就是把一个没有被dbContext跟踪的对象附加到dbCotext中使其被dbContext跟踪  1   对象上下文:DBContext 建一个新的上下文实例创建将连接到的数据库的名称...,默认状态没有对任何对象跟踪的  2   实体状态:  EF对实体状会有4种状态:       2.1  Added:对象为新对象,并且已添加到对象上下文,但尚未调用    2.2  Deleted...创建实体之后、但将其添加到对象上下文之前,该实体处于此状态   2.4 Modified:对象上的一个标量属性已更改,但尚未调用    2.5 Unchanged: 此对象尚未经过修改自对象附加到上下文中后

    1.4K40

    EF Core关系配置

    获取指定字段 var a1 = dbContext.Articles.Select(x => new {x.Id, x.Title}).First(); 只获取外键id 1、实体类显式声明一个外键属性...普通集合的版本(IEnumerable)在内存过滤(客户端评估),而IQueryable版本则是把查询操作翻译成SQL语句(服务器端评估) IQueryable books = ctx.Books...内存占用小、 DB连接占用时间长; 2、DataTable:把所有数据都一次性从数据库服务器都加载到客户端内存。内存占用大,节省DB连接。...的Entry()方法来获得实体EF Core的跟踪信息对象EntityEntry。...DbContext会根据跟踪的实体的状态,SaveChanges()的时候,根据实体状态的不同,生成Update、Delete、Insert等SQL语句,来把内存实体的变化更新到数据库

    11910

    UnitOfWork知多少

    UOW模式的作用是在业务用例的操作中跟踪对象的所有更改(增加、删除和更新),并将所有更改的对象保存在其维护的列表。在业务用例的终点,通过事务,一次性提交所有更改确保数据的完整性和有效性。...UOW处理并发 而对于这些要点,EFDBContext已经实现了。...EF的UOW 每个DbContext类型实例都有一个ChangeTracker用来跟踪记录实体的变化。当调用SaveChanges时,所有更改将通过事务一次性提交到数据库。...仓储只关注于单一聚合的持久化,而业务用例却常常会涉及多个聚合的更改,为了确保业务用例的一致型,我们需要引入事务管理,而事务管理应用服务层的关注点。我们如何在应用服务层来管理事务呢?借助UOW。...但这似乎引入了另外一个问题,因为仓储管理单一聚合的,每次做增删改时都显式的提交了更改(调用了SaveChanges),处理多个聚合时,就无法利用DbContext进行批量提交了。那该如何

    2.4K81

    EF+MySQL乐观锁控制电商并发下单扣减库存,高并发下的问题

    下订单减库存的方式 现在,连农村的大姐都会用手机上淘宝购物了,相信电商对大家已经非常熟悉了,如果熟悉电商开发的同学,就知道买家下单购买商品的时候,需要扣减库存的,当然有2种扣减库存的方式, 一种预扣库存...,相当于锁定库存, 一种直接扣减库存。...初试:EF手工版乐观锁 我们用的EF(Entity Framework)+MySQL,很不幸, EF 没法直接实现这个效果,它的DbContext数据上下文决定了要完成这种情况下的修改,得先查询到指定的数据到...但是,经过简单压力测试,上面这个程序会出现“超买”,没有控制到并发修改库存的问题,于是尝试用“EF乐观锁”来解决这个扣减库存的问题, 进阶:EF乐观锁 参考了2篇文章《EFMySQL对记录的乐观并发控制...PS:虽然解决了本文的问题,但是EF这种并发处理方案,代码编写上还是略显麻烦,是否使用ESQL或者其它ORM框架,看你的偏好了。

    2.5K80

    02-EF Core笔记之保存数据

    EF Core通过ChangeTracker跟踪需要写入数据库的更改,当需要保存数据时,调用DbContext的SaveChanges方法完成保存。...需要注意的EF Core的删除行为仅对已加载的数据生效,如果关系未加载到内存,则超出了EF Core的管控范围。 事务 事务允许原子方式处理多个数据库操作。...默认情况下,每次SaveChanges方法的所保存的所有更改都将在一个事务,要么全部保存成功,要么全部保存失败。此种情况已能满足大多数应用的需要。...并发控制 数据库并发指多个进程或用户同时访问或更改数据库的相同数据的情况。 并发控制指的是用于发生并发更改时确保数据一致性的特定机制。 EF Core采用乐观并发控制来解决并发冲突问题。...并且,对于这种情况,可直接使用DbContext的Update操作进行,Update操作内部会完成该判断。 如果实体的主键不是自动生成的,则需要手工判断实体是否存在。

    1.8K40

    EF Core 基础知识

    Core 默认会与 ASP.NET Core的日志提供程序一起工作,只需要使用AddDbContext或AddDbContextPool添加服务即可。...如果你的事物中有多个SaveChanges操作,配置的自动重试策略将会抛出异常,解决方法使用委托来手动调用执行策略。...EF Core 引入了一种状态检查机制,可以帮助我们实现是否执行成功的检测: using (var db = new BloggingContext()) { var strategy = db.Database.CreateExecutionStrategy...配置项 DbContext必须有DbContextOptions实例能,Options的作用如下: 配置数据库提供程序 连接字符串 数据库提供程序级别的可选项 EF Core级别的可选项 可以通过构造函数添加...时,需要构造函数的方式进行配置,并在Startup配置DbContext: public void ConfigureServices(IServiceCollection services) {

    78620

    基于ABP落地领域驱动设计-02.聚合和聚合根的最佳实践和原则

    因此,当你得到一个聚合时,所有的子集合已经作为查询的一部分被检索出来了,不需要任何额外配置。 ABP框架有助于您的应用程序实现这一原则。...这个功能由 ABP 工作单元系统 提供,应用服务的方法作为一个单独的工作单元,执行完之后会自动调用 DbContext.SaveChanges()。...事务边界原则 一个聚合通常被认为一个事务边界。如果用例使用单个聚合,读取并保存为单个单元,那么对聚合对象所做的所有更改,将作为原子操作保存,而不需要显式地使用数据库事务。...保持聚合根足够小 一个做法保持一个简单而小的聚合。这是因为一个聚合体将作为一个单元被加载和保存,读/写一个大对象会导致性能问题。...构造函数将参数id传递给base类,不在构造函数中生成 Guid,可以将其委托给另一个 Guid生成服务作为参数传递进来。 无参构造函数对于ORM必要的。

    3.1K30

    理解 ASP.NET Core - 配置(Configuration)

    : optional:bool类型,指示该文件是否可选的。...reloadOnChange:bool类型,指示该文件发生更改时,是否要重新加载配置。 JSON配置提供程序 通过JsonConfigurationProvider在运行时从Json文件中加载配置。...需要注意的,launchSettings.json 的配置只用于开发环境,并且该文件设置的环境变量会覆盖系统环境设置的变量。...launchSettings.json 配置环境变量时可以使用冒号(:)作为分层键,但是我测试过程,发现当同时配置了系统环境变量时,程序读取到的环境变量值会发生错乱(一部分系统环境变量,一部分该文件的环境变量...分层键: 环境变量,由于冒号(:)无法适用于所有平台,所以要使用全平台均支持的双下划线(__),它会在程序自动转换为冒号(:) 在其他类型的配置,一般均使用冒号(:)分隔符即可 ConfigurationPath

    2.2K21

    【源码解读(二)】EFCORE源码解读之查询都做了什么以及如何自定义批量插入

    ,托管IOC到web程序,在上一文章,最后关于DBContext的构造函数的内容没有讲完,本章我会讲以下几部分,会将上篇没有讲完的部分讲完,会讲关于一条查询语句普普通通的一生,如何自定义批量增删改查的方式...的服务,调用了InitializeSets方法,顾名思义,这个方法其实就是去加载我们的DBSet的,以下这个接口的实现,从下面的源码,我们不难看出,这里就是通过IDbSetFinder去查找DBContext...IDBContextOptionsExtension接口,然后去调用ApplyService方法注入EF所需要用到的一些服务,同时调用ReplaceService替换的服务也会替换,最终调用到了我们今天讲的这部分...DataBase抽象类下的,还记得我们需要在EF执行的时候打印Sql语句需要UseLogger吗,我没记错的话,日志在这个构建里面去开始触发写Sql的事件的,这里的Logger,再看下去,就会看到...最终会构建一个入参QueryContext的委托,返回我们的查询对象。最终调用结束List的构造函数里去创建一个新的List,GetEnumerable返回了我们本次的查询结果。

    36150

    EF】DbFirst实现增删改查

    大家,又见面了,我你们的朋友全栈君。...1.VS中新建控制台应用程序 2.右击刚刚建好的程序,添加“ADO.NET实体数据模型” 3.选择“来自数据库的EF设计器” 4.依次连接服务器和数据库 5.选择包括敏感数据 6.选择实体框架...这样database first的实现已经基本上完成了,如果想要用ModelFirst的方式,第3步选择”空EF设计器模型“,edmx文件自己添加数据表即可。接下来通过代码来实现对数据库的操作。...1.添加实体 //所有对数据库操作的第一步就是创建数据库访问的上下文 newssystemEntities dbContext = new newssystemEntities...指向的数据的Category表添加一条数据ca dbContext.category.Add(ca); //保存到数据库 dbContext.SaveChanges

    79310

    Entity Framework Core 2.0 入门

    这里, 常规的做法, 针对开发时的数据库, 可以通过命令直接创建和更新数据库. 而针对生产环境, 最好生成sql脚本, 然后由相关人员去执行这个脚本来完成数据库的创建或者更新....也可以): 输入用户名: 密码: 选择是否保存密码: 最后输入档案的名字: 随后VSCode将尝试连接该数据库, 成功后右下角会这样显示 (我这里输入有一个错误, 数据库名字应该是LearnEF): 随后该文件输入下面这个...tabs=aspnetcore2x 实际上, 项目已经配置Logging部分了, 默认打印到控制台和Debug窗口的....然后写查询方法: 看结果: EfCore到查询有两类语法, 一种Linq方法, 另一种Linq查询语法: 这种Linq方法: 下面这种Linq查询语法: 我基本都是使用第一种方法....查询映射关联数据. 使用Select可以返回匿名类, 里面可以自定义属性. 这个匿名类只方法内有效. 看下SQL: 可以看到SQL只Select了匿名类里面需要的字段.

    3.2K80

    Entity Framework Core 2.0 入门

    这里, 常规的做法, 针对开发时的数据库, 可以通过命令直接创建和更新数据库. 而针对生产环境, 最好生成sql脚本, 然后由相关人员去执行这个脚本来完成数据库的创建或者更新....): 随后该文件输入下面这个sql语句来查询所有的Table: -- Table 列表 SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE...tabs=aspnetcore2x 实际上, 项目已经配置Logging部分了, 默认打印到控制台和Debug窗口的....然后写查询方法: 看结果: EfCore到查询有两类语法, 一种Linq方法, 另一种Linq查询语法: 这种Linq方法: 下面这种Linq查询语法: 我基本都是使用第一种方法....查询映射关联数据. 使用Select可以返回匿名类, 里面可以自定义属性. 这个匿名类只方法内有效. 看下SQL: 可以看到SQL只Select了匿名类里面需要的字段.

    3.5K140

    03-EF Core笔记之查询数据

    Core有三种常见模型来加载关联数据: 预先加载:表示从数据库中加载关联数据,作为初始查询的一部分 显式加载:表示稍后从数据库显式加载关联数据 延迟加载:表示访问关联数据时,再从数据库中加载关联数据...服务EF Core支持部分查询客户端进行、部分查询发送到服务器,此种情况下可能会造成性能问题。...new BloggingContext()) { var blogs = context.Blogs .AsNoTracking() .ToList(); } 或者DbContext...的一点EF Core设计时就替我们考虑了如何防御SQL注入攻击,因此当我们使用FromSql方法时,参数如果有使用到拼接字符串的情况,则会自动为我们生成SQL查询参数,例如: var user...执行查询时,EF Core会检查我们的sql语句是否支持拼接,如果支持的情况下,则会将linq过滤语句拼接为sql一并发送到数据库进行查询。 跟踪 原始SQL的跟踪与Linq查询的跟踪方式一致。

    2.5K20

    【半译】ASP.NET Core创建内部使用作用域服务的Quartz.NET宿主服务

    例如,也许您需要使用EF Core DbContext遍历所有客户,并向他们发送电子邮件,并更新客户记录。我们假设这个任务为EmailReminderJob。...作业可以直接使用作用域服务 由于作业实例从IServiceProvder作用域中解析来的,因此您可以作业实现的构造函数安全地使用作用域服务。...例如,假设您有一个需要更新数据库并将事件发送到消息总线的服务。您可以每个单独的IJob实现处理所有这些问题,也可以将跨领域的“提交更改”和“调度消息”操作移到QuartzJobRunner。...当作业成功执行后(即未抛出异常),我们将所有未提交的更改保存在DbContext,并在消息总线上调度事件。...但是,此处显示的方法并不是在工作中使用范围服务的唯一方法。马修·阿伯特(Matthew Abbot) 在这个文章中演示了一种方法,该方法旨在正确处理运行后的作业的方式实现IJobFactory。

    1.8K10
    领券