我已经编写了一个 WPF 应用程序,但在刷新从 SQL Server 数据库获取的数据时遇到问题。
我正在使用 StructureMap 来注入(inject)依赖项并管理 DBContext 的生命周期。这是我的 StructureMap 配置:
ObjectFactory.Container.Configure(cfg =>
{
cfg.For<IUnitOfWork>()
.LifecycleIs(new ThreadLocalStorageLifecycle())
.Use<DBContext>();
});
但是,当我从另一个应用程序实例或直接从 SQL Server 编辑记录时,之前获取记录的客户端无法自行刷新,只能显示未修改的数据。
我使用 .LifecycleIs(new ThreadLocalStorageLifecycle()) 在每个线程上设置不同的上下文来清除 EntityFramework 的缓存,但它不起作用。
这是我的服务类:
public class DraftService : IDraftService
{
IUnitOfWork _uow;
IDbSet<Models.Draft> _draft;
public DraftService(IUnitOfWork uow)
{
_uow = uow;
_draft = _uow.Set<Models.Draft>();
}
public Models.Draft GetByID(long id)
{
return _draft.Find(id);
}
}
我按如下方式使用服务:
public class Draft
{
private IUnitOfWork _uow;
private IDraftService _draftService;
public Draft(IUnitOfWork uow, IDraftService draftService)
{
_uow = uow;
_draftService = draftService;
}
public async Task<Models.Draft> GetByID(long id)
{
return await Task.Run(() => _draftService.GetByID(id));
}
}
怎么了?为什么它不刷新数据?
提前致谢。
最佳答案
编辑:片刻的清醒之后,这就是正在发生的事情。
替换:return _draft.Find(id);//如果可以,查找使用缓存。
通过 : return _draft.SingleOrDefault(x => x.id == id)//SingleOrDefault 应该每次都从数据库中获取。
我的评论不够清楚让我们看看这个:
public class DraftService : IDraftService
{
IUnitOfWork _uow; <-- if this is disposed and _draft is accessed you'll get an error.
IDbSet<Models.Draft> _draft; <-- might be cached.
public DraftService(IUnitOfWork uow)
{
_uow = uow; <--- this context is always the same
_draft = _uow.Set<Models.Draft>();
}
public Models.Draft GetByID(long id)
{
return _draft.Find(id); <---- this will always use the cached context.
}
}
如果你让它看起来像这样。 你遇到的问题要少得多。
public class DraftService : IDraftService
{
Container _ctn;
public DraftService(Container ctn)
{
_ctn= ctn;
}
public Models.Draft GetByID(long id)
{
using(var uow = _ctn.Resolve<IUnitOfWork>()){ // new fresh context. don't forget the AlwaysUnique.
return uow.Set<Draft>().Find(id); // should return the newer revision.
}}
}
如果你不想传递容器:
public class DraftService : IDraftService
{
IUnitOfWorkResolver _rslv;
public DraftService(IUnitOfWorkResolver rslv)
{
_rslv= rslv;
}
public Models.Draft GetByID(long id)
{
using(var uow = rslv.GetContext()){ // new fresh context. don't forget the AlwaysUnique.
return uow.Set<Draft>().Find(id); // should return the newer revision.
}}
}
public class UnitOfWorkResolver{
public IUnitOfWork GetContext(){
return new DBContext(); //or whatever you want you could use Container.Resolve<IUnitOFWork>() instead.
}
}
我没有放置 IUnitOfWorkResolver,但你明白了......
关于c# - 刷新 EntityFramework 中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37945160/