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

时间:2016-07-05 18:10:18

标签: c# wpf xaml mvvm entity-framework-6

我已经看到了与此错误相关的几个不同问题,但似乎没有一个问题与我的体验相似。我刚刚在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中得到一个浅蓝色下划线警告,其中显示&#34;在应用程序配置文件中找不到名为[myEntities]的连接字符串。&#34;但是App.config文件中存在连接字符串,当我构建并运行程序时,它按预期工作。

有关为何发生这种情况的任何想法?

3 个答案:

答案 0 :(得分:7)

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

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

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

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

另一种方法是接受这种情况并更好地处理您的错误。也许记录缺少的连接字符串。或者抓住异常并继续前进。那里不是最好的设计决定。

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

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

答案 1 :(得分:0)

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

  

将我的MainWindowViewModel移动到新文件夹

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

无论其编辑器处理启发式是否导致找不到移动文件的当前位置的文件。

答案 2 :(得分:0)

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

如果你把datacontext放在代码隐藏中并从XAML文件中删除了datacontext,那么错误也就消失了,它仍然编译得很好。

DataContext = new MainWindowViewModel();

我总是试图让我的代码隐藏空洞,但据我所知,在这种情况下几乎没有任何不利因素。