【问题标题】:ConnectionString Not Found in App.Config but is Definitely There在 App.Config 中未找到 ConnectionString,但肯定存在
【发布时间】:2017-09-21 12:48:45
【问题描述】:

我遇到了一个我之前看到过的问题,但答案似乎只适用于 ASP.NET MVC,而我使用的是 WPF(使用实体框架)。

我在 VS 中的 XAML 设计器目前如下所示:

这是在UserControl 上,代码非常简单:

<UserControl x:Class="door_system.Views.HomeView"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                 xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
                 xmlns:viewModels="clr-namespace:door_system.ViewModels"
                 mc:Ignorable="d" 
                 d:DesignHeight="300" d:DesignWidth="300">

    <UserControl.DataContext>
        <viewModels:HomeViewModel/>
    </UserControl.DataContext>

    <Grid>
        <DataGrid AutoGenerateColumns="False">
            <DataGridTextColumn Width="*"/>
            <DataGridTextColumn Width="*"/>
            <DataGridTextColumn Width="*"/>
        </DataGrid>
    </Grid>
</UserControl>

所以我的项目设置如下:

只有一个app.config 文件肯定包含连接字符串:

<connectionStrings>
  <add name="MicrotrakContext" connectionString="metadata=res://*/Models.MicrotrakModel.csdl|res://*/Models.MicrotrakModel.ssdl|res://*/Models.MicrotrakModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=*******;initial catalog=MicrotrakEvolution;user id=******;password=********;multipleactiveresultsets=True;application name=EntityFramework&quot;" providerName="System.Data.EntityClient" />
</connectionStrings>

当我构建项目时,没有错误。当我运行该项目时,它也执行没有错误。这是我发现的错误吗?

除了名称更改之外,我还有两个项目以几乎完全相同的方式设置,构建和运行都没有问题。

调用HomeViewModel中的上下文的任务:

private Task LoadTransactionsTask()
{
    return Task.Run(() =>
    {
        using (var context = new MicrotrakContext())
        {
            AllTransactions = new ObservableCollection<Transaction>(
                (from record in context.Transactions
                    select record)
                .Where(x => x.CreationTime >= DateTime.Today)
                .ToList());
        }
    });
}

【问题讨论】:

  • code 和实际异常在哪里?你试过调试你的代码吗? XAML 不查询数据库。您如何定义和使用您的 EF 上下文?
  • @PanagiotisKanavos 请查看编辑。
  • 堆栈跟踪显示了什么?请,请,请,PLEASE 发布连接字符串文本,而不是连接字符串文本的不可分割的黑色屏幕截图。这看起来像一个模糊的 EF 连接字符串。该元素看起来不像是模糊的 EF config 部分。
  • “我在 VS 中的设计器目前看起来像这样”您指的是您的 XAML 设计器、EF 模型设计器还是其他什么?
  • @jcruz XAML 设计师。

标签: c# wpf entity-framework


【解决方案1】:

VS 设计器为什么会抛出异常

您的某些应用程序代码(例如HomeViewModel)由 XAML 设计器进程执行。您的代码(例如new MicrotrakContext())查找当前进程的配置文件,而不是您的 app.config。

如何解决

您应该阻止您的应用程序访问数据库、文件系统或任何其他 I/O 操作,并改为提供一些设计时数据。

我在这里描述了一些技巧:Daniel Turan's answer to: Does mmvm stop the ability for Visual Studio designer to show XAML

基本上,您可以签入您的代码:

if (DesignerProperties.GetIsInDesignMode(someDepenencyObject))
{
    LoadDesignTimeData();
}
else
{
    LoadRealData();
}

编辑:
我更喜欢的方式是 DesignTime 视图模型:

public class HomeViewModelDesignTime : HomeViewModel
{
    protected override Task LoadTransactionsTask()
    {
       //load some hard coded design time data
    }
}

告诉设计者使用这个类:

<UserControl x:Class="door_system.Views.HomeView"
    d:DataContext="{d:DesignInstance Type=local:HomeViewModelDesignTime, IsDesignTimeCreatable=true}"

例如,您可以在代码隐藏中实例化您真正的 ViewModel。

提示:在 Visual Studio 中创建您自己的项目项模板,它将为您创建带有 ViewModel 和 DesignTimeViewModel 的 UserControl,因此您不必每次都手动进行。

【讨论】:

  • 从我在上述问题中的 XAML 代码中,我看不到我正在执行任何类似的操作?这就是我上面的所有 XAML 代码。为什么设计者的代码要找配置文件?
  • 因为您正在 xaml 中实例化您的 HomeViewModel,并且它是通过实体框架访问数据库。我猜你是从 HomeViewModel 的 ctor 打电话给LoadTransactionsTask
  • 感谢您的宝贵时间。我是否应该在代码隐藏而不是 XAML 中实例化我的 ViewModel
  • XAML 肯定应该有关于 ViewModel 类型的信息。您可以通过在 xaml 中实例化 ViewModel 来实现,就像您所做的那样,或者使用 {d:DesignInstance} 标记扩展。请参阅我的编辑和我的答案中提供的链接。
  • 更新 - 即使您进行了编辑,我仍然收到一条消息说它找不到连接字符串,但是现在它在 XAML 代码本身中,我可以看到设计器。
【解决方案2】:

此时您的代码是否正确编译: using (var context = new MicrotrakContext())

您可以快速搜索:: base("name=,预期 MicrotrakContext 将是 name= 之后的值。

【讨论】:

  • 欢迎来到stackoverflow。下次在 cmets 中发布您的问题,而不是在答案中。
【解决方案3】:

我遇到了同样的问题。发生这种情况是因为您试图在设计时进行一些数据库访问。解决这个问题:

  1. 从用户控件构造函数中删除所有代码(只保留 IncializeComponent 方法);被移除的代码,应该插入到userControl_Load方法中;
  2. 在执行具有查询的方法之前,只需验证它是否处于设计模式

    if (!DesignMode)
    {
      // Functions that have any database access should be here (eg. queries, inserts, etc)
    }
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-19
    • 1970-01-01
    • 2012-08-15
    • 1970-01-01
    • 2023-01-13
    • 2016-08-31
    • 2015-01-06
    • 2011-01-24
    相关资源
    最近更新 更多