【问题标题】:DataContext creation in which layer?DataContext在哪一层创建?
【发布时间】:2011-05-05 10:35:38
【问题描述】:

我正在使用 RIA 创建一个新的 Silverlight 应用程序。我正在使用业务层和数据访问层,它看起来像这样......

Silverlight->ASP.Net/RIA->C# BLL 类库->C# DAL 类库 我的实体框架模型可在所有层中访问。

我不确定在哪里为我的实体框架请求创建 DataContext。我应该在 RIA (ASP.Net) 层上创建上下文并将其传递给 BLL,然后再传递给 DAL,还是应该在 DAL 中创建它并将 LINQ 结果传回?

如果我在 DAL 中创建它并备份一个实体,延迟加载意味着数据还没有。在我有机会从数据库中实际查询我的数据之前,我的上下文是否可能会被垃圾回收?

如果我在 DAL 中创建上下文会遇到线程问题吗?

【问题讨论】:

    标签: silverlight frameworks entity data-access-layer datacontext


    【解决方案1】:

    如果您仍然在使用 RIA 服务,您不妨使用 LinqToEntitiesDomainServiceEfModelGoesHere> 并让 RIA 服务持有单个 EF DataContext/model。

    我们将自己的自定义 POCO 用于业务逻辑,但 RIA 服务管理从客户端到我们各个数据层的所有连接(包括直接到 EF)。在需要时,我们传递单个 EF 模型(存储在域上下文的 ObjectContext 成员中)。

    保留 EF 引用而不是切换到普通的 DomainService 感觉是正确的,并且使快速(临时)添加到 Domain Service 变得非常容易,因为我们只是 LINQ 直接到 EF 模型。如果我们向下管理它,我们就会不断地将它拉回 RIA 层以使用它。

    【讨论】:

      【解决方案2】:

      您在应用程序的 Silverlight(客户端)部分创建数据上下文。我通常将我的上下文留在班级的一个变量中,以便我可以重用它。在对类的所有引用都消失之前,它不会被垃圾收集。这是一个从数据库异步加载一些对象(实体)的简短示例(通过回调来处理返回的对象):

      public class MyClass
      
          private _context as MyDomainContext
          private _employees as list(of Employees)
      
          public sub DoSomething()
              _context = new MyDomainContext
              _context.Load(_context.GetEmployeesQuery(), AddressOf EmployeesLoaded, Nothing)
          end sub
      
          public sub EmployeesLoaded(loadOp as LoadOperation(Of Employee))
              _employees = new list(of Employee)(loadOp.entities)
          end sub
      
      end class
      

      【讨论】:

      • Scottie 指的是实体框架 DataContext,而不是 DomainContext。另一个很好的干净例子。干杯
      猜你喜欢
      • 2011-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-19
      • 1970-01-01
      • 2018-03-09
      • 2016-03-08
      • 1970-01-01
      相关资源
      最近更新 更多