繁体   English   中英

在设计时WinForms实体框架数据库连接异常

[英]WinForms Entity Framework database connection exception at design-time

环境:我有一个Visual Studio 2017解决方案,其中包含一个包含实体框架(EF6)DbContext和POCO的Model项目,一个实现存储库和工作单元模式的数据访问层项目,以及一个WinForms UI项目。 在UI主窗体中,有一个选项卡控件,在一个选项卡页上,有一个UserControl。 在UserControl上有DataGridView。 在UserControl的Load方法中,我通过UnitofWork(从EF获取数据)从数据库中获取一些数据,并使用该数据填充DataGridView(不使用数据绑定)。

问题:在设计时,当我打开主窗体设计器时,我得到一个SQL Server连接异常“在建立与SQL Server的连接时发生了与网络有关或特定于实例的错误。找不到服务器或无法访问该服务器。 ...”。 堆栈跟踪表明它正在运行填充DataGridView的代码,但是在设计时无法连接到数据库。 当我构建和运行应用程序时,一切正常。

已经研究/发现: 这个SO答案表明我可以使用if (!DesignMode) {...}来包装我不想在设计时运行的代码。 没关系,但是我将添加更多此类UserControl,并且我正在寻找更清洁的解决方案。 是否有一种简单的方法(如几行代码)来...

  1. 告诉EF在设计时返回空对象列表?

要么

  1. 给EF一个连接字符串以在设计时使用,以便它可以成功地访问数据库?

我尚未向App.config添加任何连接字符串。 我只是使用Entity Framework与localDb的默认连接。

重新安装Windows,SQL Server和Visual Studio之后,我得到了相同的行为。 经过更多搜索后,很明显,当您将UserControl添加到窗体中或打开包含UserControl的窗体的设计器时,Visual Studio总是在设计时运行UserControl的Load方法。 解决方案是在Load方法中测试DesignMode属性的值。

private void MyUserControl_Load(object sender, EventArgs e)
{
    if (!this.DesignMode)
    {
        // do stuff here, if it involves connecting to the database
    }
}

从需要检查您当前是否处于设计模式的意义上来说,Matthew的答案是正确的。 但是, this.DesignMode可能不是最好的检查方法,因为它并不完全可靠。 例如,如果控件是另一个控件的一部分,则即使父控件为true, this.DesignMode也会返回false。 这个问题着眼于测试您是否处于设计模式的其他方法。

对我有用的方法就是来自答案。

public bool isInDesignMode()
{
    System.Diagnostics.Process process = System.Diagnostics.Process.GetCurrentProcess();
    bool res = process.ProcessName == "devenv";
    process.Dispose();
    return res;
}

感谢GWLlosa提供此代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM