调整实体框架 - dbContext?

时间:2014-10-08 16:15:34

标签: vb.net performance entity-framework

我有一些模特课:

Public Class MyViewModel

   Public Property MyID() As Integer

   Public ReadOnly Property FirstList As IEnumerable(Of SelectListItem)
      Get
        Using dbContext As New MyContext
            Dim itemQuery = (From t In dbContext.ItemSet Select t)
            Dim item As IEnumerable(Of Item) = itemQuery.ToList()
            Return item.Select(Function(o) New SelectListItem() With {.Text = o.ItemDesc, .Value = o.ID})
        End Using
      End Get
   End Property

   Public ReadOnly Property SecondList As IEnumerable(Of SelectListItem)
     Get
        Using dbContext As New MyContext
            Dim _Query = (From t In dbContext.FrameworkSet Select t)
            Dim _list As IEnumerable(Of Item2) = _Query.ToList()
            Return _list.Select(Function(o) New SelectListItem() With {.Text = o.Item2Desc, .Value = o.ID})
        End Using
     End Get
  End Property
End Class

基本上,我打电话给MyContext两次。这反复实例化EF,对吗?所以我的想法只是有一个全球类

Dim dbContext as New MyContext

除了代码分析,告诉我需要实现IDisposable(根据这个:http://blog.jongallant.com/2012/10/do-i-have-to-call-dispose-on-dbcontext.html#.U6WdzrGEeTw我不用担心?)

我很困惑 - 什么是公认的最佳做法?

2 个答案:

答案 0 :(得分:1)

除了Phil Soady的评论(简单地说,不是将上下文存储在全局变量中而是更喜欢短暂存在的上下文),我想指出大部分上下文初始化都不是按照构造进行的对象的对象,而是应用程序的生命周期。这主要是建立内部模型的过程,然后进行缓存。

点击此处查看更多详情:http://blog.oneunicorn.com/2011/04/15/code-first-inside-dbcontext-initialization/

答案 1 :(得分:0)

Using块是EF的理想选择。 背景的全局变量是噩梦的一个秘诀。 Context不是线程安全的,仅供短期使用。 保持逻辑流中的多个操作的上下文是常见的。 由于上下文内容可以重用。变更检测,工作单元提交控制都是EF的一部分。但是不要试着长时间保持上下文。随着上下文的增长,您可能会在上下文中遇到更多性能问题。您还需要考虑多用户和并发问题。即使PC上的一个简单的独立APP我也会在每个"按钮上创建和处理(使用)内容。点击一个应用程序。