Entity Framework中:创建ExecutionStrategy的上下文与委托内上下文有何关系?
EF中创建执行策略的上下文与委托内上下文的关系
这两个BloggingContext实例没有直接的运行时关联,它们的作用和关系可以拆解为以下几点:
外部上下文仅作为"配置模板"
外部创建的db实例,唯一的作用是利用自身的配置(数据库连接信息、EF Core模型配置、数据库提供者类型等),生成匹配当前环境的ExecutionStrategy(执行策略,比如SQL Server的重试策略)。执行策略的类型和重试规则由上下文的配置决定,因此需要一个已完成配置的上下文来创建对应的策略实例。委托内的上下文是独立工作单元
执行策略的核心逻辑是当遇到可重试的异常时,重新执行整个委托内的操作。如果复用外部的上下文,重试时上下文的跟踪状态(比如已添加/修改的实体、变更记录)会残留,导致数据逻辑混乱、重复操作等问题。因此必须在委托内重新实例化上下文,确保每次重试都是一个全新的、干净的工作单元,避免状态污染。两者共享相同的配置规则
虽然是完全独立的实例,但它们基于同一个BloggingContext类的配置(比如OnConfiguring方法中定义的连接字符串、OnModelCreating中的模型映射),所以连接的是同一个数据库,执行的操作逻辑完全一致。
示例代码逻辑说明
using var db = new BloggingContext(); var strategy = db.Database.CreateExecutionStrategy(); strategy.Execute( () => { // 每次重试都会创建全新的上下文,保证状态干净 using var context = new BloggingContext(); using var transaction = context.Database.BeginTransaction(); context.Blogs.Add(new Blog { Url = "http://blogs.msdn.com/dotnet" }); context.SaveChanges(); context.Blogs.Add(new Blog { Url = "http://blogs.msdn.com/visualstudio" }); context.SaveChanges(); transaction.Commit(); });
内容的提问来源于stack exchange,提问作者Donny Kwitty
相关产品推荐
相关产品推荐

