我刚创建了一个用户控件。 此控件还使用我的静态实体框架类来加载两个组合框。 一切都很好,运行没有问题。设计和运行时正在运行。 然后,当我停止应用程序时,包含我的UserControl的所有表单在设计时不再有效。我只看到两个错误:
ERROR1: 指定的命名连接在配置中找不到,不打算与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部分(见上文)并重建。 这很奇怪,一切都在同一个程序集中,相同的命名空间(为了简单起见)。
有人有想法吗?
答案 0 :(得分:9)
看起来你在设计模式下以某种方式执行数据库代码。为了防止这种情况,请搜索导致此问题的控件和方法,并使用:
if (DesignMode)
return
此外,静态缓存数据库上下文是一个非常糟糕的主意。它会导致多线程问题,以及进行插入和删除时的问题。数据库上下文用于单个“工作单元”,添加2,删除3个其他对象并调用SaveChanges
一次。
答案 1 :(得分:2)
我遇到了同样的问题,
就我而言,我在用户控件加载事件中添加了一些数据库代码,这些代码使用了一些库,这些库在运行时才加载。
因此建议不要在用户控件加载事件中编写任何数据库代码。
希望,这对你有帮助!
答案 2 :(得分:0)
如果在userControl的构造函数上调用函数“LaadCbx()”,则显示此错误。
因为实体框架的初始化存在于此函数中。
解决方案是在父窗体的构造函数中调用此函数“LaadCbx()”。