【问题标题】:Lifetime of DbContext in EF code first in WinForm ProjectsEF 代码中 DbContext 的生命周期首先在 WinForm 项目中
【发布时间】:2013-12-10 08:57:16
【问题描述】:

最近我问了一个问题(CRUD operations with connected POCOs instead of disconnected POCOs in EF code first),基于这个问题和这个评论(CRUD operations with connected POCOs instead of disconnected POCOs in EF code first),现在我想在我的项目中使用连接的POCOs,所以我还有一个问题。

但我认为,如果我使用视图模型,当我使用DbContext 的实例从数据库中获取我的数据并将它们映射到视图时,当我想要持久化用户更改时,DbContext(获取的数据)现在不存在(因为例如,当我从我的 DAL 调用 GetOrders() 时,DbContext 创建然后处置),所以我应该在客户端管理我的 POCOs 状态并将它们复制回新创建的DbContext(在我的 DAL 的 SaveOrder() 中)。

我说的对吗?

【问题讨论】:

  • 你是对的。您处于“MVC 范例”中:视图是 winform 和控制器,在功能上等同于 Web 服务器,通过 DTO 从单独的程序集调用。 (尽可能多地)。控制器是 DAL 和域(即业务逻辑)之间的链接,域本身就是另一个程序集。组装分离不是必需的,但它可以帮助保持良好状态。 (这里的好可能是主观的)
  • @tschmit007 那么我该如何解决这个问题呢?(失去连接的实体状态)
  • 通常我给我的表单一个connectionString作为属性。形成连接字符串,您可以做任何事情,包括实例化上下文。对于状态,就像您在网络环境中所做的一样。
  • @tschmit007:但我认为这不是个好主意,因为违反了 SOC。(将 DAL 与 UI 混合使用)
  • 对,这就是 UI 实例化一个存储库(即接口的具体实现)的原因,它公开了一些访问方法。存储库从通过表单或任何注入方法获得的连接字符串构建上下文 (DAL)。所以表单(UI)使用了一个接口,而忽略了接口的实现。

标签: c# winforms entity-framework poco dbcontext


【解决方案1】:

您可以将 DbContext 变量定义为 DAL 类上的静态字段来解决此问题。

        private static YourAppContainer _dbContainer;
        public static YourAppContainer DbContext
        {
            get
            {
                try
                {
                    return _dbContainer ?? (_dbContainer = new YourAppContainer());
                }
                catch (Exception ex)
                {
                    throw new Exception(ex);
                }
            }
        }

【讨论】:

  • 但是如果我将我的 DbContext 设置为静态,是否想在单独的层中使用我的 DAL?我的意思是,如果我的 DAL 在多个用户之间共享(在服务器端),那么我认为您的解决方案无法正常工作。
  • 您应该在 DAL 层中创建一个外观类来访问 DAL 方法和其他成员。实体框架也支持多用户和多线程,不用担心。
猜你喜欢
  • 2014-05-18
  • 2012-03-15
  • 2020-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-22
相关资源
最近更新 更多