在我的.NetCore 6 win应用程序上,我的上下文生存期出现了一些问题。总之,我有一个按钮,当单击该按钮时,调用一个存储库,然后从我的DB中检索一个记录,并在文本字段中显示该记录中的一个值。在数据库中的值发生变化之前,这是正常的。进一步单击按钮将继续显示旧值。
我就是这样在winforms应用程序中注册上下文的
services.AddDbContext<MyContext>(b => b.UseSqlServer(connectionString));然后,我登记我的服务如下:
services.AddScoped<IMyRepo, MyRepo>();我想这是一个表单长期运行且从不处理上下文的问题,因此,在关闭表单并使用新的上下文重新打开表单之前,结果总是相同的。
我在我的回购中使用这个,以强制每次新的结果,然而似乎是一个任务,这样做的每一个请求我提出的数据库.
_entities.Entry(log).Reload();有没有一个更清洁的方法,我可以做到这一点,而不必做重新装载?
发布于 2022-11-11 03:37:37
老实说,我不会为WinForms/WPF使用MS IoC AddDbContext。也许有一种方法可以让它在某种形式的终生范围内发挥的很好,但老实说,我还没有意识到。我也不将它用于web项目,仅仅是因为它将DbContext范围设置为请求,而且在某些情况下,我希望对DbContext的生存期有更多的控制。(例如处理中毒上下文)
对于web和WPF,我使用了一个称为DbContextScope的工作单元模式来管理DbContext和与存储库的关系。其想法是,使用者使用注入的DBContextScopeFactory创建DbContextScope (包装一个或多个DbContext实例),存储库接受注入的DbContexScopeLocator以获得对请求的DbContextScope的访问。
最初的EF6实现是由Medhi (https://github.com/mehdime/DbContextScope连用https://www.nuget.org/packages/Mehdime.Entity)实现的。
EF核心6:(https://www.nuget.org/packages/Zejji.DbContextScope.EFCore6)
或者,如果DbContext的作用域可以包含在存储库调用本身中(跟踪的实体不需要在存储库之外传递),那么您也可以使用注入的DbContextFactory类根据需要提供DbContext实例。像上面这样的UoW模式的优点是,您可以控制DbContext实例活动的范围,这样就可以将多个操作一起提交或回滚。如果需要,DbContext实例可以在多个存储库之间使用。
https://stackoverflow.com/questions/74391837
复制相似问题