我遇到的问题是我之前看过的,但答案似乎只适用于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="data source=*******;initial catalog=MicrotrakEvolution;user id=******;password=********;multipleactiveresultsets=True;application name=EntityFramework"" 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());
}
});
}
答案 0 :(得分:2)
您的一些应用程序代码(例如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)
我有同样的问题。发生这种情况是因为您试图在设计时进行一些数据库访问。解决此问题的方法:
只需验证其是否处于设计模式,然后再执行具有查询的方法。
declare module someModule {
class SomeClass {
constructor(v: string);
test: (v: string) => void;
}
namespace helpers {
export function someFunction(v: any): Promise<string>;
}
}
export = logger;