在 WinForms 中将 Simple Injector 与后台工作器一起使用以使用 EF6 保存到数据库

杰夫芬恩

我得到了一个旧的 WinForms 应用程序来更新和改进。我正在尝试使用 SimpleInjector 添加 DI。我习惯了 .Net MVC,但这是我第一次使用 WinForms。

该应用程序使用了大量的 BackGround 工作者。我的理解是,这是特定于 WinForms 的,每个后台工作人员都会创建一个新线程。

我认为我的问题是,当我想使用 EF6 将数据保存到数据库时,由于多线程,SaveChanges 方法无法保存。

我的 SimpleInjector 容器设置如下

_container = new Container();
_container.Options.DefaultScopedLifestyle = new ThreadScopedLifestyle();

// Register DbContext
_container.Register<DbContext, MyDbContext>(Lifestyle.Scoped);

当我在 dbContext 上调用 SaveChanges 时,我得到的结果为 0,这表示没有记录保存到数据库中。在我的调试器中,我收到一条错误消息,指出 DbContext 已被处理。如果这发生在保存之前,它解释了为什么从 SaveChanges 返回 0。不幸的是,之前的开发人员捕获了每个异常,因此应用程序正在尝试处理每个错误,这使得故障排除变得困难并导致意外行为。

我期望为每个线程创建一个新的 DbContext,并且 SaveChanges 将保存在每个线程中所做的更改,以便在一个上下文中发生的事情不会影响其他线程中的其他 DbContext。

当我从数据库中读取数据时,我会在每个方法中手动创建一个新的 DbContext。当 using 块完成时,它是否可能正在处理 DbContext ?

using (var newDbContext = new MyDbContext())
{
    return newDbContext.Set<TableA>().First(x => x.Id == id);
}

我希望如果我正确配置了 SimpleInjector,我也不需要这样做。

我在这个阶段有点迷茫,认为我可能没有正确理解文档,任何建议将不胜感激。提前致谢。

史蒂文

我期待为每个线程创建一个新的 DbContext

这不是TheadScopedLifestyle工作方式。使用ThreadScopedLifestyle,在显式启动的上下文中将有一个注册实例,Scope并且此范围是特定于线程的。这意味着一个线程可以拥有该服务的多个实例,因为一个线程可以存活很长时间,而一个线程Scope通常只能存活很短的时间。

的典型用途ThreadScopedLifestyle如下:

void MethodThatRunsInABackGroundThread()
{
    using (ThreadScopedLifestyle.BeginScope(container))
    {
        var service = container.GetInstance<ISomeService>();
        service.DoWork();
    }
}

当您解析Scoped活动范围之外的实例(或某些包含范围实例的对象图)时,Simple Injector 将抛出异常。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在EF6代码优先中将泛型类型与数据库上下文一起使用

来自分类Dev

在OWIN中将Simple Injector与WebApi自托管一起使用时,为什么会出现此ActivationException?

来自分类Dev

在 Laravel 中将多个数据一次保存到数据库中

来自分类Dev

如何在Rails 6中将多个复选框保存到数据库

来自分类Dev

使用通用存储库实现Simple Injector

来自分类Dev

在 EF6 中使用数据注释

来自分类Dev

如何在表单中将Json发布到控制器然后保存到数据库

来自分类Dev

EF6 与 EF 核心单个数据模型还是多个用于与 REST 服务一起使用的“大型”数据库?

来自分类Dev

EF6:将参考/查找数据与IQueryable一起使用

来自分类Dev

使用EF6失败的SqlServer数据库镜像故障转移仅镜像原则

来自分类Dev

使用EF6加载数据库初始化程序时出错

来自分类Dev

使用EF6加载数据库初始化程序时出错

来自分类Dev

Nest无法使用EF6 / MVC5应对大型数据库模型

来自分类Dev

当我用EF6查询数据库时,使用LINQ有什么优势?

来自分类Dev

EF6首先使用SQLite模型创建数据库

来自分类Dev

允许字符{使用EF Core的ExecuteSqlRaw保存到数据库

来自分类Dev

使用EF6和LINQ深度加载数据

来自分类Dev

如何在Rails中将数组保存到数据库

来自分类Dev

在Codeigniter中将密码保存到数据库

来自分类Dev

在WordPress中将字符串保存到数据库

来自分类Dev

MVC5 EF6无需使用模型即可从数据库表中读取数据

来自分类Dev

是否可以在同一解决方案中将后台工作程序与单独的类库一起使用

来自分类Dev

使用EF6将文档存储在数据库ASP.NET MVC5中-代码优先

来自分类Dev

MVC5 EF6 CodeFirst使用两个数据库进行调试和发布

来自分类Dev

如何在EF6代码优先中对数据库上下文使用通用类型

来自分类Dev

首先在ASP.Net MVC EF6数据库中使用VB.Net

来自分类Dev

如何使用get方法基于EF6中数据库中的值返回文本

来自分类Dev

使用EF6和.NET 4.6.1进行数据库迁移时遇到多个错误

来自分类Dev

为什么我不能使用 ef6 代码先更新数据库 mysql 迁移?

Related 相关文章

  1. 1

    如何在EF6代码优先中将泛型类型与数据库上下文一起使用

  2. 2

    在OWIN中将Simple Injector与WebApi自托管一起使用时,为什么会出现此ActivationException?

  3. 3

    在 Laravel 中将多个数据一次保存到数据库中

  4. 4

    如何在Rails 6中将多个复选框保存到数据库

  5. 5

    使用通用存储库实现Simple Injector

  6. 6

    在 EF6 中使用数据注释

  7. 7

    如何在表单中将Json发布到控制器然后保存到数据库

  8. 8

    EF6 与 EF 核心单个数据模型还是多个用于与 REST 服务一起使用的“大型”数据库?

  9. 9

    EF6:将参考/查找数据与IQueryable一起使用

  10. 10

    使用EF6失败的SqlServer数据库镜像故障转移仅镜像原则

  11. 11

    使用EF6加载数据库初始化程序时出错

  12. 12

    使用EF6加载数据库初始化程序时出错

  13. 13

    Nest无法使用EF6 / MVC5应对大型数据库模型

  14. 14

    当我用EF6查询数据库时,使用LINQ有什么优势?

  15. 15

    EF6首先使用SQLite模型创建数据库

  16. 16

    允许字符{使用EF Core的ExecuteSqlRaw保存到数据库

  17. 17

    使用EF6和LINQ深度加载数据

  18. 18

    如何在Rails中将数组保存到数据库

  19. 19

    在Codeigniter中将密码保存到数据库

  20. 20

    在WordPress中将字符串保存到数据库

  21. 21

    MVC5 EF6无需使用模型即可从数据库表中读取数据

  22. 22

    是否可以在同一解决方案中将后台工作程序与单独的类库一起使用

  23. 23

    使用EF6将文档存储在数据库ASP.NET MVC5中-代码优先

  24. 24

    MVC5 EF6 CodeFirst使用两个数据库进行调试和发布

  25. 25

    如何在EF6代码优先中对数据库上下文使用通用类型

  26. 26

    首先在ASP.Net MVC EF6数据库中使用VB.Net

  27. 27

    如何使用get方法基于EF6中数据库中的值返回文本

  28. 28

    使用EF6和.NET 4.6.1进行数据库迁移时遇到多个错误

  29. 29

    为什么我不能使用 ef6 代码先更新数据库 mysql 迁移?

热门标签

归档