在App.Config中找不到ConnectionString但是肯定在那里

时间:2017-09-21 12:48:45

标签: c# wpf entity-framework

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

我在VS中的XAML设计师目前看起来像这样:

enter image description here

这是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>

所以我的项目设置如下:

enter image description here

只有一个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());
        }
    });
}

3 个答案:

答案 0 :(得分:2)

为什么VS Designer会抛出异常

您的一些应用程序代码(例如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 viewmodel:

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,因此您不必每次都手动执行。

答案 1 :(得分:0)

此时您是否正确编译代码: using (var context = new MicrotrakContext())&lt; - 它知道MicrotrakContext()是什么吗?

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

答案 2 :(得分:0)

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

  1. 从User Control构造函数中删除所有代码(只允许InicializeComponent方法);删除的代码应该插入到userControl_Load 方法中;
  2. 只需验证其是否处于设计模式,然后再执行具有查询的方法。

    declare module someModule {
      class SomeClass {
        constructor(v: string);
        test: (v: string) => void;
      }
    
      namespace helpers {
        export function someFunction(v: any): Promise<string>;
      }
    }
    
    export = logger;