嗨,我对WPF和C#还很陌生,所以如果这只是一个愚蠢的问题,请对我宽容一点:
我正在使用VS2012,实体框架来创建一个预先存在的数据库的模型,我想将一些表绑定到一些ListView。。。现在,我知道有不同的方法可以做到这一点,但当我尝试使用ObjectDataProvider时,我在设计时收到一个错误"在应用程序配置文件中找不到名为…的连接字符串"。
奇怪的是,如果我运行我的应用程序,一切都正常工作,我只想删除那个丑陋的错误消息,并希望在我的列表广告设计时获得数据(这就是为什么我想使用objectdataprovider)。
以下是我的代码的一些部分:
应用程序配置:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<connectionStrings>
<add name="BibliotecaEntities"
connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient;provider connection string='data source=(LocalDB)v11.0;attachdbfilename="G:PROGETTI-SOFTWAREc# testsBibliotecaBibliotecabiblioteca-db.mdf";initial catalog=BibliotecaDB;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework'"
providerName="System.Data.EntityClient" />
</connectionStrings>
</configuration>
ListaScaffali.xaml:
<Window x:Class="Biblioteca.ShelvesList"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Biblioteca;assembly="
Title="ShelvesList" Height="341" Width="609">
<Window.Resources>
<ObjectDataProvider ObjectType="{x:Type local:BooksDB_Handler}" MethodName="TuttiGliScaffali" x:Key="ScaffaliObjSrc" />
</Window.Resources>
<Grid>
<Grid>
<ListView Name="listaScaffali" ItemsSource="{Binding Source={StaticResource ScaffaliObjSrc}}">
<ListView.View>
<GridView>
<GridViewColumn Header="Scaffali Disponibili:" DisplayMemberBinding="{Binding Scaffale}" />
</GridView>
</ListView.View>
</ListView>
</Grid>
</Grid>
</Window>
BooksDB处理程序.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Configuration;
using System.Data.Entity;
using System.Collections.ObjectModel;
namespace Biblioteca
{
public static class BooksDB_Handler
{
...
public static ObservableCollection<Scaffali> TuttiGliScaffali()
{
using (var ctx = new BibliotecaEntities())
{
var reader = from d in ctx.Scaffali
select d;
return new ObservableCollection<Scaffali>(reader);
}
}
...
}
}
在我的数据库中,表"Scaffali"只有两列:"ScaffaliID"(身份)和"Scaffale"。
我在某个地方读到这可能是Visual Studio的错误,并尝试了各种方法:
- 多次重建
- 避免路径中的#
- 编译为32位(我运行的是Win8 x64)
但直到现在都没有运气。。。
谢谢你友好的回答。
-=更新04/03/2013=-
到目前为止,我还没有发现是什么条件导致了这种奇怪的行为,无论如何,我发现如果我只是按顺序构建(而不是重建)两次,错误消息就会消失,一切似乎都正常工作。。。
我也遇到了同样的问题,我发现在设计时,IDE似乎没有读取App.config来获取连接字符串,所以在建立连接时它会爆炸。我最终做的是检查代码是否在设计时,并手动创建一些项目用于设计目的。
我使用以下代码来了解环境是否处于设计模式:
public static bool IsInDesignMode
{
get
{
#if Silverlight
return !HtmlPage.IsEnabled;;
#else
return DesignerProperties.GetIsInDesignMode(new DependencyObject());
#endif
}
}
然后在我返回项目的代码中,我执行以下操作:
if (IsInDesignMode)
{
GetSampleData();
}
else
{
GetQueryData();
}
我只是简单地实现了这两种方法。
可能有更好的解决方案,但这对我来说效果很好。
这个解决方案看起来很有前景,但我还没有让它为我工作…
来源:http://developernote.com/2012/03/rich-design-time-experience-with-wpf-and-ef-in-visual-studio-2010/
有时,在设计时查看数据的能力大大促进了WPF控件的创建。如果我使用数据绑定控件开发具有复杂UI的WPF控件,我通常会定义一个用于访问一些典型数据项的属性:
public static ComplexData DesignTimeItem
{
get
{
using (DatabaseContext db = new DatabaseContext())
{
var products = from p in db.products.Include("ProductType")
where p.product_id == 131
select p;
product product = products.First();
return new ComplexData(product, "100 kg");
}
}
}
然后我在设计时直接在XAML中使用这个属性:
<UserControl x:Class="SomeControl"
...
xmlns:local="clr-namespace:ControlNamespace"
DataContext="{Binding Source={x:Static local:ComplexData.DesignTimeItem}, Mode=OneWay}"
...
>
然后我需要做最后一步。问题是默认实体上下文构造函数(DatabaseContext)使用了运行时应用程序配置文件app.config:中包含的连接字符串
<connectionStrings>
<add name="MyContext" connectionString="metadata=res://*/MyModel.csdl|res://*/MyModel.ssdl|res://*/MyModel.msl;provider=MySql.Data.MySqlClient;provider connection string="password=******;User Id=myuser;server=myserver;database=mydb;Persist Security Info=True;charset=utf8"" providerName="System.Data.EntityClient"/>
</connectionStrings>
但在设计时,应用程序配置文件是devenv.exe.config,它不包括连接字符串,因此我的WPF控件的创建失败,导致设计器无法加载。为了解决这个问题,我只需将app.config中包含的连接字符串复制到"C:\Program Files(x86)\Microsoft Visual Studio 10.0\Common7\IDE\"的devenv.exe.config,然后重新启动Visual Studio。
您是否尝试过自己使用ConnectionString构建DataContext对象,而不是让框架使用配置文件中指定的对象?我通常更喜欢自己构造那个对象,这样我就可以很容易地将它移到另一个程序集并注入连接依赖项。但那是另一回事。在你的情况下,我建议你试试这些东西:
- 在webconfig中保留连接字符串
-
自己构建上下文
var connectionStringBuilder=新EntityConnectionStringBuilder{元数据="{Metadata}",Provider="{Provider}",ProviderConnectionString="{来自配置的连接字符串}"};
var ctx=新的BibliotecaEntities(connectionStringBuilder.ToString());
我只是给你一个提示,你可以试试。我还没有尝试过全部细节。希望能有所帮助。