4

こんにちは、私は WPF と C# にかなり慣れていません。

私は VS2012、Entity Framework を使用して既存のデータベースのモデルを作成しています。いくつかのテーブルをいくつかの ListView にバインドしたいと考えています。 ObjectDataProvider 設計時に「アプリケーション構成ファイルに ... という名前の接続文字列が見つかりませんでした」というエラーが表示されます。

奇妙なことに、アプリケーションを実行するとすべてが正常に機能し、その醜いエラー メッセージを削除し、できればリスト広告のデザイン時にデータを取得したいと考えています (それが objectdataprovider を使用したい理由です)。

ここに私のコードのいくつかの部分があります:

App.Config:

<?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=&quot;G:\PROGETTI-SOFTWARE\c# tests\Biblioteca\Biblioteca\biblioteca-db.mdf&quot;;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-Handler.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);
            }
        }

    ...

    }
}

私のDBでは、テーブル「Scaffali」には「ScaffaliID」(アイデンティティ)と「Scaffale」の2つの列しかありません。

これは Visual Studio のバグである可能性があることをどこかで読み、さまざまなことを試しました。

  1. 何度か作り直す
  2. パスで # を避ける
  3. 32ビット用にコンパイルします(Win8 x64を実行しています)

しかし、今まで運がなかった...

親切な回答ありがとうございます。

-= 2013 年 4 月 3 日更新 =-

これまでのところ、この奇妙な動作の原因となっている条件をまだ見つけていませんが、とにかく、ビルドする (再ビルドしない) を 2 回続けて実行すると、エラー メッセージが消えて、すべてが正常に動作するように見えることがわかりました...

4

3 に答える 3

3

私は同じ問題を抱えていましたが、設計時に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();
}

そして、これら 2 つの方法を実装するだけです。

より良い解決策があるかもしれませんが、これは私にとってはうまくいきました。

于 2013-02-15T21:56:50.053 に答える
1

このソリューションは有望に見えましたが、まだ機能していません...

ソース: 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=&quot;password=******;User Id=myuser;server=myserver;database=mydb;Persist Security Info=True;charset=utf8&quot;" 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 を再起動します。

于 2016-04-28T16:24:32.873 に答える
0

構成ファイルで指定されたものをフレームワークに使用させる代わりに、ConnectionString を使用して DataContext オブジェクトを自分で構築しようとしましたか? 私は通常、そのオブジェクトを自分で構築することを好むので、簡単に別のアセンブリに移動して、接続の依存関係を挿入できます。しかし、それは別の話です。あなたの場合、次のことを試すことをお勧めします。

  1. 接続文字列を webconfig に保持します。
  2. 自分でコンテキストを構築する

    var connectionStringBuilder = new EntityConnectionStringBuilder { Metadata = "{metadata}", Provider = "{provider}", ProviderConnectionString = "{config からの接続文字列}" };

    var ctx = new BibliotecaEntities(connectionStringBuilder.ToString());

ヒントだけあげますので試してみてください。私は完全な詳細でそれを試していません。それが役に立てば幸い。

于 2013-02-16T01:49:25.440 に答える