dpp*_*dpp 2 c# dependency-injection entity-framework-core asp.net-core
以下是我DbContext在ASP.NET Core Startup中添加服务的方法:
services.AddDbContextPool<AppDbContext>(options =>
options.UseMySql(Configuration.GetConnectionString("DefaultConnection")));
services.AddScoped<ClassA, ClassA>();
services.AddScoped<ClassB, ClassB>();
Run Code Online (Sandbox Code Playgroud)
ClassA - Method1
_dbContext.EntityX.Add(new EntityX { ... });
var product = ClassB.GetProduct(key);
_dbContext.EntityY.Add(new EntityY { Product = product });
_dbContext.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
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;
Run Code Online (Sandbox Code Playgroud)
我会诚实地告诉你我还没有尝试过运行这个代码,为了简洁,这些代码被剥离(严重)版本的真实代码.
我的问题是:
1)我和DbContext两者都有相同的吗?这有保证吗?ClassAClassB
2)如果两个ClassA并ClassB具有相同的DbContext,将SaveChanges在ClassB牵动EntityX中添加的我ClassA?
3)我应该怎样做才能隔离ClassA和ClassB?
我和
DbContext两者都一样吗?这有保证吗?ClassAClassB
数据库上下文被注册为作用域依赖项,这意味着在处理单个传入请求期间共享实例.每个请求都将获得自己的依赖项注入范围,因此在单个请求中,您可以保证获得相同的数据库上下文实例.
另一方面,您还可以保证为单独的请求获取单独的数据库上下文.
如果同时
ClassA与ClassB具有相同的DbContext,将SaveChanges在ClassB影响EntityX中加我ClassA?
对此的简短回答是肯定的.由于它是单个数据库上下文,因此还有一个正在跟踪的实体集合.因此,如果您ClassA.Method1先运行并且没有在SaveChanges那里进行调用,然后运行ClassB.Method2,SaveChanges()则后者也会保存第一种方法的更改.
虽然这可能听起来有问题,但实际上通常不会:请求通常作为控制器动作的一部分处理,因此有一个非常明确的控制流程.因此,没有任何并行处理,只要您在使用后总是"清理"上下文(例如通过调用SaveChanges())就没有问题.
相反,您也可以利用此优势在整个处理请求期间共享事务,而无需您的方法知道它们是事务的一部分.
我应该怎么做来隔离
ClassA和ClassB?
想想你是否真的需要隔离.您Method2可能影响的唯一方法Method1是Method1对未保存的实体执行更改.如果你这样做,那么你可能会滥用你的实体.通常,方法应该完成对实体的工作,而不会留下脏状态.
| 归档时间: |
|
| 查看次数: |
161 次 |
| 最近记录: |