在AddDbContext时加上ServiceLifetime.Singleton参数,代码如下:
services.AddEntityFrameworkSqlServer()
.AddDbContext<EfDbContext>(options =>
{
options.UseSqlServer(Configuration["data:ConnectionString"]);
}, ServiceLifetime.Singleton);
昨天研究了一天,今天研究了一上午,一直在怀疑为什么没有callcontext,还尝试手动实现线程内唯一,一直没解决。感谢dudu。
Singleton单例不行呀。单例成全局的context了
Singleton的话 第一次请求将add实例加入context,第二次请求savechange是可以保存成功的。
@坦荡: 之前弄错了,应该是ServiceLifetime.Scoped
@dudu: 嗯嗯 我试了一下Scoped ,感谢。
但是在类库中创建context 没有startup.cs 是应该在什么时候 什么位置来调用这样一个注入的方法呢。
1 public static void DIContext() 2 { 3 var connection = @"Server=2013-20150707DJ\SQL2012EXPRESS;Database=AppDb;Trusted_Connection=True;"; 4 IServiceCollection services = new ServiceCollection(); 5 services.AddEntityFrameworkSqlServer().AddDbContext<AppDbContext>(options => 6 { 7 options.UseSqlServer(connection); 8 }, ServiceLifetime.Scoped); 9 }
@坦荡: 如果你自己注入,自己解析,可以参考这里的代码,不然让调用方注入。
@dudu: 比如我在Dal层,从GetService<AppDbContext>()中取出context,并做了一段操作(一段增删改),另一层在工作单元用GetService<AppDbContext>()取出context统一保存。
context在同一个service中是保持唯一的。
但是不同层,应该无法保证是同一个service吧,自然取出的context也就不同了。这样就不能保证唯一了呢。
还是像以前的Callcontext方便呀
@坦荡: 不需要用GetService,在构造函数中声明:
public class TabNavRepository : ITabNavRepository
{
private EfDbContext _dbContext;
public TabNavRepository(EfDbContext dbContext)
{
_dbContext = dbContext;
}
}
保证同一个Context就行了?