chu*_*wik 10 c# entity-framework dependency-injection unity-container unit-of-work
我有一个问题,EF没有返回3层WPF应用程序中的最新数据,我怀疑它与我如何处理我的上下文的生命周期有关.这是场景:
UnitOfWork中包含几个存储库.还有一个服务(MyService),它使用UnitOfWork.还必须直接从UI调用此UnitOfWork,而不通过服务.
在我的主窗口的ViewModel中,我创建了一个新窗口(首先使用ViewModel):
var dialog = new DialogViewModel(_eventAggregator, _unitOfWork, Container.Resolve<CarService>());
Run Code Online (Sandbox Code Playgroud)
这个主窗口ViewModel有一个UnitOfWork,它已经在构造函数中注入,并传递给DialogViewModel.
CarService的构造函数也需要一个UnitOfWork,它也在它的构造函数中注入:
public CarService(IUnitOfWork unitOfWork){
_unitOfWork = unitOfWork;
}
Run Code Online (Sandbox Code Playgroud)
当在DialogViewModel中使用CarService进行查询以检索某些数据并进行一些更新时,它第一次正常工作.但是,当下次检索该数据时进行相同的查询,而不是返回最新的修改后的数据,它将返回旧的/缓存的数据.使用UnitOfWork(在CarService内部)的查询如下所示:
var values = _unitOfWork.GarageRepository.GetSomeValues();
_unitOfWork.GarageRepository.MakeSomeChangesToTheValuesUsingStoredProcedure();
Run Code Online (Sandbox Code Playgroud)
第二次调用它时,值不包含最新版本的数据; 但它已在DB中成功更新.
我正在使用Unity进行DI,这就是我的容器的样子:
public class Container
{
public static UnityContainer Container = new UnityContainer();
// Called once in the AppBoostraper, as soon as the GUI application starts
public void BuildUp()
{
Container.RegisterType<IUnitOfWork, UnitOfWork>();
Container.RegisterType<ICarService, CarService>();
}
}
Run Code Online (Sandbox Code Playgroud)
为什么不返回正确的数据,我该如何解决?
chu*_*wik 20
我终于找到了问题,这与我对unitOfWork/dbcontext生命周期的管理有关.
我正在加载一些实体,然后用存储过程更新它们(因此代码中的实体不再是最新版本),然后再次加载查询; 此时EF从缓存中获取值而不是从DB中获取值.
我发现了两种解决方法:
一个相当"hacky"的,迫使实体重新加载:
Context.Entry(entity).Reload();
Run Code Online (Sandbox Code Playgroud)使用using封装unitOfWork使用,以便在每个事务结束时处理上下文,从而在下次获取新数据.我认为这更符合UnitOfWork的意图,对我来说感觉更强大.我还将UnitOfWork包装在一个工厂中,所以现在它被注入到构造函数中.
using (var uOw = new unitOfWorkFactory.GetNew())
{
// make the queries
}
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
12647 次 |
| 最近记录: |