在应用程序配置文件中找不到名为“x”的连接字符串......但它有效吗?

Posted

技术标签:

【中文标题】在应用程序配置文件中找不到名为“x”的连接字符串......但它有效吗?【英文标题】:No connection string named 'x' found in application config file... but it works? 【发布时间】:2016-11-07 16:11:06 【问题描述】:

我已经看到了几个与此错误相关的不同问题,但似乎都不是我所遇到的。我只是按照 CodeProject.com 上的一个简单的项目教程来更好地理解使用 MVVM 模式和实体框架 (http://www.codeproject.com/Articles/873592/Tutorial-for-a-Basic-WPF-MVVM-Project-Using-Entity)。我直接跟着它,一切似乎都很完美。

但是我有点好奇,开始改变一些东西。我想更多地了解命名空间在 XAML 中的工作方式,因此我将 MainWindowViewModel 移到了一个名为 ViewModels 的新文件夹中。然后我在我的 XAML 中添加了一个名为“vms”的新命名空间,并在适当的位置设置了我的窗口数据上下文:

<Window x:Class="CpMvvMWithEntity.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:vms="clr-namespace:CpMvvMWithEntity.ViewModels"
    xmlns:local="clr-namespace:CpMvvMWithEntity"
    mc:Ignorable="d"
    Title="MainWindow" Height="350" Width="525">

<Window.DataContext>
   <vms:MainWindowViewModel />
</Window.DataContext>

但是当我这样做时,我在 Visual Studio 中收到一条浅蓝色下划线警告,上面写着“在应用程序配置文件中找不到名为 [myEntities] 的连接字符串”。但是 App.config 文件中存在一个连接字符串,当我构建并运行该程序时,它按预期工作。

关于为什么会发生这种情况的任何想法?

【问题讨论】:

【参考方案1】:

您正在视图中声明视图模型的实例。这会导致 VS 在编辑器中实例化您的类,然后在 VS 进程中运行您的构造函数代码。

您的构造函数正在尝试连接到数据库。它正在 app.config 文件中为当前运行的进程寻找连接字符串。当前运行的进程是 Visual Studio。我不相信有一个devenv.exe.config 文件,如果有,它肯定没有你的连接字符串(请不要去创建一个并将你的连接放在那里!)。

您的代码出错了,编辑器旨在从 UI 组件中捕获错误并在 UI 中显示警告。它正在为您的代码执行此操作。

解决方案是不在构造函数中执行工作。你真的不应该在那里进行长时间运行的操作。您应该将数据库逻辑移到哪里只能由您和您的应用程序设计决定。

另一种选择是接受这种情况并更好地处理您的错误。也许记录丢失的连接字符串。或者捕获异常并继续前进。那里不是最好的设计决策。

另一种解决方案是不要以这种方式设置 DataContext。在代码隐藏中创建它并在那里分配它。这样,您可以执行检查 to see if you're in the designer 并完全跳过该过程。

最后一个选项:没有伤害,没有犯规。只需忘记设计器中的错误。它至少不会损害您的应用程序。继续执行更重要的任务。

【讨论】:

啊哈,我现在明白了。感谢您为我解决这个问题。我认为它只是为了举例而设计的,但结果确实让我感到困惑。 只是为了验证,我在构造函数中注释掉了方法调用,错误消失了,所以这是有道理的。我仍然想知道为什么在我移动文件夹之前它没有显示这个。错误开始出现后,我多次重新启动 VS,以为这是智能感知缓存错误或类似于 @OmegaMan 所说的,但似乎并没有解决它。【参考方案2】:

构建应用程序和在编辑器模式下工作是编辑器的两个不同活动。编辑器必须在代码可以成功编译的状态和失败状态下解析/构建代码;每次它必须给出最终结果;就像您已经编译并构建了应用程序一样。

将我的 MainWindowViewModel 移动到一个新文件夹中

由于您移动了位置,完整的 build 编译将链接到创建应用程序所需的部分,并且正如您所见,它可以正常工作。但是对于编辑器来说,当它解析顶层的MainWindowViewModel时,它可能有一个app.config的缓存版本位置,它是在父级别而不是新级别。

不管它的编辑器处理启发式方法是否导致在移动文件的当前位置找不到文件。

【讨论】:

【参考方案3】:

Microsoft 在其网站上声称这是实体框架问题。但是,我(和其他人)发现了一些奇怪的东西。当您关闭导致错误的文件时,错误本身也会消失。我不确定这是否是 VS 的正常行为,或者还有什么原因。

如果您将 datacontext 放在代码隐藏中并从 XAML 文件中删除 datacontext,则错误也会消失,并且仍然可以正常编译。

DataContext = new MainWindowViewModel();

我总是尽量让我的代码隐藏为空,但据我了解,在这种情况下几乎没有缺点。

【讨论】:

以上是关于在应用程序配置文件中找不到名为“x”的连接字符串......但它有效吗?的主要内容,如果未能解决你的问题,请参考以下文章

在应用程序配置文件中找不到名为“MyEntities”的连接字符串

发生了错误。 : 在应用程序配置文件中找不到名为“EmployeeDBEntities”的连接字符串

EF在应用程序配置文件中找不到名为“XXX”的连接字符串。

.NET的EF框架中:在应用程序配置文件中找不到名为“”的连接字符串问题

DB First,ASP Net Core 2.1,EF6:InvalidOperationException:在应用程序配置文件中找不到名为“DataContext”的连接字符串

在应用程序文件中找不到名为“...实体”的连接字符串,但它存在吗?