作者:程武钢2011 | 来源:互联网 | 2022-12-02 16:38
以下是我DbContext
在ASP.NET Core Startup中添加服务的方法:
services.AddDbContextPool(optiOns=>
options.UseMySql(Configuration.GetConnectionString("DefaultConnection")));
services.AddScoped();
services.AddScoped();
ClassA - Method1
_dbContext.EntityX.Add(new EntityX { ... });
var product = ClassB.GetProduct(key);
_dbContext.EntityY.Add(new EntityY { Product = product });
_dbContext.SaveChanges();
ClassB - GetProduct
//Check product if it exists in the database
//Else, get details of the product from a Web API
var newProduct = new Product{ ... }
_dbContext.Products.Add(newProduct );
_dbContext.SaveChanges();
return newProduct;
我会诚实地告诉你我还没有尝试过运行这个代码,为了简洁,这些代码被剥离(严重)版本的真实代码.
我的问题是:
1)我和DbContext
两者都有相同的吗?这有保证吗?ClassA
ClassB
2)如果两个ClassA
并ClassB
具有相同的DbContext
,将SaveChanges
在ClassB
牵动EntityX
中添加的我ClassA
?
3)我应该怎样做才能隔离ClassA
和ClassB
?
1> poke..:
我和DbContext
两者都一样吗?这有保证吗?ClassA
ClassB
数据库上下文被注册为作用域依赖项,这意味着在处理单个传入请求期间共享实例.每个请求都将获得自己的依赖项注入范围,因此在单个请求中,您可以保证获得相同的数据库上下文实例.
另一方面,您还可以保证为单独的请求获取单独的数据库上下文.
如果同时ClassA
与ClassB
具有相同的DbContext
,将SaveChanges
在ClassB
影响EntityX
中加我ClassA
?
对此的简短回答是肯定的.由于它是单个数据库上下文,因此还有一个正在跟踪的实体集合.因此,如果您ClassA.Method1
先运行并且没有在SaveChanges
那里进行调用,然后运行ClassB.Method2
,SaveChanges()
则后者也会保存第一种方法的更改.
虽然这可能听起来有问题,但实际上通常不会:请求通常作为控制器动作的一部分处理,因此有一个非常明确的控制流程.因此,没有任何并行处理,只要您在使用后总是"清理"上下文(例如通过调用SaveChanges()
)就没有问题.
相反,您也可以利用此优势在整个处理请求期间共享事务,而无需您的方法知道它们是事务的一部分.
我应该怎么做来隔离ClassA
和ClassB
?
想想你是否真的需要隔离.您Method2
可能影响的唯一方法Method1
是Method1
对未保存的实体执行更改.如果你这样做,那么你可能会滥用你的实体.通常,方法应该完成对实体的工作,而不会留下脏状态.