【问题标题】:EF in a UserControl can't see the app.config?UserControl 中的 EF 看不到 app.config?
【发布时间】:2015-11-09 02:29:58
【问题描述】:

我刚刚创建了一个用户控件。 此控件还使用我的静态实体框架类来加载两个组合框。 一切都很好,运行没有问题。设计和运行时正在工作。 然后,当我停止应用程序时,包含我的 UserControl 的所有表单在设计时都不再工作。我只看到两个错误:

错误1: 指定的命名连接在配置中未找到,不打算与 EntityClient 提供程序一起使用,或者无效。

错误 2: 变量ccArtikelVelden 要么未声明,要么从未赋值。 (ccArtikelVelde 是我的UserControl

运行时一切仍在运行

我的静态 EF Repositoy 类:

public class BSManagerData
{
    private static BSManagerEntities _entities;
    public static BSManagerEntities Entities
    {
        get
        {
            if (_entities == null)
                _entities = new BSManagerEntities();
            return _entities;
        }
        set
        {
            _entities = value;
        }
    }
}

在我的 UserControl 中发生了一些逻辑来加载组合框中的数据:

private void LaadCbx()
{
    cbxCategorie.DataSource = (from c in BSManagerData.Entities.Categories
                               select c).ToList();
    cbxCategorie.DisplayMember = "Naam";
    cbxCategorie.ValueMember = "Id";
}

private void cbxCategorie_SelectedIndexChanged(object sender, EventArgs e)
{
    cbxFabrikant.DataSource = from f in BSManagerData.Entities.Fabrikants
                              where f.Categorie.Id == ((Categorie)cbxCategorie.SelectedItem).Id
                              select f;
    cbxFabrikant.DisplayMember = "Naam";
    cbxFabrikant.ValueMember = "Id";
}

在设计时让我的表单再次工作的唯一方法是注释掉 UserControl 中的 EF 部分(见上文)并重建。 很奇怪,所有东西都在同一个程序集中,同一个命名空间(为了简单起见)。

谁有想法?

【问题讨论】:

  • 我一看到“静态实体框架类”这个词就停止了阅读。别那样做。现在。 ObjectContext 不适合以这种方式使用。

标签: c# entity-framework user-controls windows-forms-designer


【解决方案1】:

看起来您以某种方式在设计模式下执行数据库代码。为防止这种情况,请查找导致这种情况的控件和方法,并使用:

if (DesignMode)
    return

另外,静态缓存数据库上下文是一个非常糟糕的主意。它会导致多线程问题,以及当您进行插入和删除时。数据库上下文旨在用于单个“工作单元”,添加 2 个,删除 3 个其他对象并调用一次 SaveChanges

【讨论】:

  • 感谢您的回复,我完全赞成最佳做法,如果使用静态类是不好的做法,我必须看看我应该如何以另一种方式做到这一点。问题是我前段时间遇到了一个错误,我无法从另一个上下文编辑对象。我在 StackOverflow 上读到创建静态类是解决方案之一。这就是我采用这种方法的原因。每次我需要访问数据库时,我也不喜欢围绕我的操作构建 using 语句。我是 EF 的新手,所以欢迎任何建设性的建议!
  • 刚刚尝试了你的建议,但仍然不好。现在我做了以下事情: private void LaadCbx() { if (DesignMode) return; cbxCategorie.DataSource = (从 BSManagerData.Entities.Categories 中的 c 选择 c).ToList(); cbxCategorie.DisplayMember = "Naam"; cbxCategorie.ValueMember = "Id";但是,当我尝试将控件添加到我的表单时,我收到以下错误:img716.imageshack.us/img716/6549/eferror.png
  • 你从哪里调用 LaadCbx()?如果您从构造函数中调用它,请尝试将其从控件的构造函数中删除。最好(不仅针对这个问题,而且一般而言)在构造函数中尽可能少地执行操作,尤其是数据库连接。您应该能够使用像 OnLoad 这样的钩子来加载数据。
  • 感谢我将它放在 Load 事件中的建议,因为这确实看起来是一个更好的位置。然而,我不得不将 DesignMode 放在那里。否则它将无法正常工作。不明白为什么抱怨。对 UserControl 来说 app.config 不可见吗?您能否也给我一些关于 EF 统计类的建议。如果我在表单上有一个组合框,我从上下文中加载对象,并且我想保存一个包含组合框中的对象的对象,该组合框是我使用以前的上下文加载的?我该如何处理?分离/附加?我该如何实现仓库模式?
  • EF 使用 当前应用程序 的 App.Config。这意味着当您在 Visual Studio 中设计控件时,它将使用 devenv.exe.config。连接未在此处列出。此外,由于 DB 访问可能会产生其他副作用(减慢设计器的速度,导致不需要的 DB 查询),因此最好在设计时将其关闭。
【解决方案2】:

我遇到了同样的问题,

就我而言,我在用户控件加载事件中添加了一些数据库代码,这些代码正在使用一些库,这些库直到运行时才加载。

因此建议不要在用户控件加载事件中编写任何数据库代码。

希望对你有帮助!

【讨论】:

  • 谢谢你,伙计!我刚刚花了 3 个小时,试图理解,我做错了什么。我试图重新创建实体模型,创建了一些测试解决方案......答案很简单:不要在用户控制加载事件中编写数据库代码!
【解决方案3】:

如果您在 userControl 的构造函数上调用函数“LaadCbx()”,则会显示此错误。

因为实体框架的初始化存在于这个函数中。

解决办法是在父窗体的构造函数中调用这个函数“LaadCbx()”。

【讨论】:

    猜你喜欢
    • 2012-03-12
    • 2012-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多