gpt4 book ai didi

c# - 刷新 EntityFramework 中的数据

转载 作者:太空宇宙 更新时间:2023-11-03 23:13:53 25 4
gpt4 key购买 nike

我已经编写了一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com