Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
实体框架:WPF与ASP.Net中的上下文。。。如何处理_Wpf_Entity Framework - Fatal编程技术网

实体框架:WPF与ASP.Net中的上下文。。。如何处理

实体框架:WPF与ASP.Net中的上下文。。。如何处理,wpf,entity-framework,Wpf,Entity Framework,目前,对于ASP.Net内容,我使用一个请求模型,其中每个请求都会创建一个上下文(仅在需要时),并在该请求结束时进行处理。我发现这是一个很好的平衡,既不必使用每查询模型进行旧的操作,也不必永远使用上下文。现在的问题是,在WPF中,我不知道有什么可以像请求模型那样使用。现在看来,永远保持相同的上下文(这可能是一场噩梦)或回到令人讨厌的使用每查询模型是一个巨大的痛苦。我还没有看到一个好的答案 我的第一个想法是有一个打开和关闭(或任何名称)的情况,在这种情况下,被调用的顶级方法(比如一个事件处理方法,

目前,对于ASP.Net内容,我使用一个请求模型,其中每个请求都会创建一个上下文(仅在需要时),并在该请求结束时进行处理。我发现这是一个很好的平衡,既不必使用每查询模型进行旧的操作,也不必永远使用上下文。现在的问题是,在WPF中,我不知道有什么可以像请求模型那样使用。现在看来,永远保持相同的上下文(这可能是一场噩梦)或回到令人讨厌的使用每查询模型是一个巨大的痛苦。我还没有看到一个好的答案

我的第一个想法是有一个打开和关闭(或任何名称)的情况,在这种情况下,被调用的顶级方法(比如一个事件处理方法,比如单击)将“打开”上下文,并在最后“关闭”它。由于我在UI项目中没有任何内容知道上下文(所有查询都包含在“扩展”生成的实体类的方法中,这些实体类有效地在实体和UI之间创建了一个伪层),这似乎会使实体层依赖于UI层

我真的很茫然,因为我对州政府的规划不是很熟悉

补充:

我读过关于使用线程的书,但是 我有一个关于上下文的问题 无所事事就是错误和恢复

假设我有一个更新用户信息的表单 信息和有一个错误。这个 用户表单现在将显示更改 指向上下文中的用户对象 这是好的,因为它使一个更好的 用户体验无需重新键入 所有的变化

现在,如果用户决定转到 另一种形式。这些变化仍然存在 在上下文中。在这一点上,我很高兴 被错误的用户卡住了 对象,否则我必须 告诉上下文重置的UI 那个用户。我想那不是 可怕的(用户上的重新加载方法) 但我不知道那是不是 真正解决了这个问题


你有没有想过尝试一个单位的工作?我有一个类似的问题,我基本上需要能够打开和关闭一个上下文,而不暴露我的EF上下文。我认为我们使用的是不同的体系结构(我使用的是一个IoC容器和存储库层),所以我必须对这段代码进行一些裁剪,以便向您展示。我希望有帮助

首先,当涉及到“Something\u Click”方法时,我会有如下代码:

using (var unitOfWork = container.Resolve<IUnitOfWork>){

   // do a bunch of stuff to multiple repositories, 
   // all which will share the same context from the unit of work

   if (isError == false)    
      unitOfWork.Commit();
}
if (UnitOfWork.Current != null)
{
    return UnitOfWork.Current.ObjectContext;
}
else
{
    return container.Resolve<Entities>();
}
这可能需要一些工作才能将其考虑到您的解决方案中,但这可能是一种选择

public class UnitOfWork : IUnitOfWork
{
    private static LocalDataStoreSlot slot = Thread.AllocateNamedDataSlot("UnitOfWork");
    private Entities entities;

    public UnitOfWork(Entities entities)
    {
        this.entities = entities;
        Thread.SetData(slot, this);
    }

    public Entities ObjectContext
    {
        get
        {
            return this.Entities;
        }
    }

    public static IUnitOfWork Current
    {
        get { return (UnitOfWork)Thread.GetData(slot); }
    }

    public void Commit()
    {
        this.Entities.SaveChanges();
    }

    public void Dispose()
    {
        entities.Dispose();
        Thread.SetData(slot, null);
    }
}