【问题标题】:Why can my VB.NET User Control not instantiate an ObjectContext?为什么我的 VB.NET 用户控件不能实例化 ObjectContext?
【发布时间】:2012-09-26 13:44:44
【问题描述】:

我有以下几行代码作为测试用户控件。构建项目时,我将此用户控件拖到窗体上,我收到一个错误对话框,大意是 EF 找不到上下文的连接字符串。然而,当我在表单中使用相同的变量时,一切都很好。用户控件似乎使用与通常的 app.config 不同的上下文来查找连接字符串。

Public Class InvoiceWorkOrderSearch
    Private _dataHelper As WorkOrderData = New WorkOrderData()
End Class

【问题讨论】:

  • 用户控件是否在与您添加的项目不同的项目中?
  • 分离 UI 和数据层。用户控件中的上下文很糟糕。
  • @GertArnold 上下文在 BO 层,但是表单实例化了一个 BO 助手,它实例化了上下文。这是一份紧急的初稿,所以我不想在这个阶段用 DI 把事情搞得一团糟。

标签: vb.net entity-framework user-controls


【解决方案1】:

在设计期间?

如果控件处于运行时模式,您可以避免仅实例化对象。

检查设计时间的内置属性 (Me.DesignMode) 很差,因为它只告诉您当前是否正在设计控件本身。如果您将用户控件放在表单上,​​它会返回 false。

您可以使用此代码检查设计时间:http://dotnet-snippets.de/dns/designmode-workaround-windows-forms-SID299.aspx

Public Class InvoiceWorkOrderSearch
    Private _dataHelper As WorkOrderData

    Public Sub New()
        If IsDesignMode(me) = False Then
            _dataHelper = New WorkOrderData()
        End If
    End Sub()
End Class

【讨论】:

  • 我使用了与这个答案非常相似的东西,但我也使用了#If Debug #else #EndIf 用于其他场景...... IsDesignMode 非常适合拖放控件。
  • 您不能为此使用#Debug 指令,因为如果您曾经部署调试版本,这将评估为 true。
  • 这也解决了无数其他相关问题。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-08
  • 2011-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多