c# - 刷新 EntityFramework 中的数据

标签 c# wpf entity-framework structuremap unit-of-work

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

相关文章:

C# 对象失去它的引用并变为空

WPF 数据触发器

entity-framework - Entity Framework 代码优先 - 定义与 MembershipUser 的关系

c# - 您能否对接口(interface)进行 Moq 模拟,并通过实现该接口(interface)的类型的强制转换和空检查?

c# - 取消 session 的事件?

.net - WPF中的MethodInvoker?

c# - WPF:数据绑定(bind)对于模态对话框是否重要?

c# - 将 Entity Framework 对象绑定(bind)到 Datagridview C#

c# - LINQ vs sql - 带回太多行

c# - 如何使用 VSTO 加载项项目轻松创建 Excel UDF