首页 新闻 会员 周边 捐助

EF Core如何保证上下文线程唯一。

1
[已解决问题] 解决于 2016-10-07 13:32

没有CallContext类。貌似HttpContext也不行。

在类库中创建上下文并且保证唯一。

有老司机操作过了么??

坦荡的主页 坦荡 | 初学一级 | 园豆:105
提问于:2016-09-15 21:17
< >
分享
最佳答案
0

在AddDbContext时加上ServiceLifetime.Singleton参数,代码如下:

services.AddEntityFrameworkSqlServer()
    .AddDbContext<EfDbContext>(options =>
    {
        options.UseSqlServer(Configuration["data:ConnectionString"]);
                    
    }, ServiceLifetime.Singleton);
奖励园豆:5
dudu | 高人七级 |园豆:30778 | 2016-09-16 12:02

昨天研究了一天,今天研究了一上午,一直在怀疑为什么没有callcontext,还尝试手动实现线程内唯一,一直没解决。感谢dudu。

坦荡 | 园豆:105 (初学一级) | 2016-09-16 12:07

Singleton单例不行呀。单例成全局的context了

坦荡 | 园豆:105 (初学一级) | 2016-09-16 14:08

Singleton的话 第一次请求将add实例加入context,第二次请求savechange是可以保存成功的。

坦荡 | 园豆:105 (初学一级) | 2016-09-16 14:12

@坦荡: 之前弄错了,应该是ServiceLifetime.Scoped

dudu | 园豆:30778 (高人七级) | 2016-09-16 14:14

@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         }
坦荡 | 园豆:105 (初学一级) | 2016-09-16 14:17

@坦荡: 如果你自己注入,自己解析,可以参考这里的代码,不然让调用方注入。

dudu | 园豆:30778 (高人七级) | 2016-09-16 14:56

@dudu: 比如我在Dal层,从GetService<AppDbContext>()中取出context,并做了一段操作(一段增删改),另一层在工作单元用GetService<AppDbContext>()取出context统一保存。

context在同一个service中是保持唯一的。

但是不同层,应该无法保证是同一个service吧,自然取出的context也就不同了。这样就不能保证唯一了呢。

还是像以前的Callcontext方便呀

坦荡 | 园豆:105 (初学一级) | 2016-09-16 15:08

@坦荡: 不需要用GetService,在构造函数中声明:

public class TabNavRepository : ITabNavRepository
{
    private EfDbContext _dbContext;

    public TabNavRepository(EfDbContext dbContext)
    {
        _dbContext = dbContext;
    }
}
dudu | 园豆:30778 (高人七级) | 2016-09-16 15:13
其他回答(1)
0

保证同一个Context就行了?

顾晓北 | 园豆:10898 (专家六级) | 2016-09-18 14:36
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册