質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

2回答

5677閲覧

Wpf デザイナー画面がエラー表示になる (EntityFramework)

propg

総合スコア113

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2017/01/26 03:17

###前提・実現したいこと
C#(WPF)+EntityFramework6を使ってシステムの試作を行っています。
DBにはSQLServerCompactを使用

ビルドでき、実行すればDBに接続した画面表示は問題なく行えています。

ですが、デザイナー画面がエラー表示になり、デザインが表示されません。

###デザイナに表示されるエラーメッセージ

MetadataException: 指定されたスキーマが無効です。エラー: (0,0) : エラー 0152: ADO.NET プロバイダーに、不変名が 'System.Data.SqlServerCe.4.0' の Entity Framework プロバイダーがありません。アプリケーションの構成ファイルの "entityFramework" セクションにプロバイダーが登録されていることを確認してください。詳細については、http://go.microsoft.com/fwlink/?LinkId=260882 を参照してください。

原因は、デザインに貼り付けているUserControlで、UserControlのLoadedイベント中でEntityFramework経由でデータ取得を行っているところで、処理をコメントアウトするとデザイナーは表示されます。

実行自体はできることから、デザイン時にのみ情報が取得できないのだと推測しています。

###App.config

<?xml version="1.0" encoding="utf-8"?> <configuration> <configSections> <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> <section name="Hoge.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" /> </sectionGroup> <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --></configSections> <entityFramework> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlCeConnectionFactory, EntityFramework"> <parameters> <parameter value="System.Data.SqlServerCe.4.0" /> </parameters> </defaultConnectionFactory> <providers> <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> <provider invariantName="System.Data.SqlServerCe.4.0" type="System.Data.Entity.SqlServerCompact.SqlCeProviderServices, EntityFramework.SqlServerCompact" /> </providers> </entityFramework> <connectionStrings> <!-- コンテキストのクラス名と同じ名前で接続文字列を作成する --> <add name="HogeDbContext" connectionString="Data Source=c:\HogeLocalDB.sdf;Password=hoge" providerName="System.Data.SqlServerCe.4.0" /> </connectionStrings> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" /> </startup> <system.data> <DbProviderFactories> <remove invariant="System.Data.SqlServerCe.4.0" /> <add name="Microsoft SQL Server Compact Data Provider 4.0" invariant="System.Data.SqlServerCe.4.0" description=".NET Framework Data Provider for Microsoft SQL Server Compact" type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" /> </DbProviderFactories> </system.data></configuration>

###試したこと
UserControlのコンストラクタに
var y = typeof(System.Data.Entity.SqlServerCompact.SqlCeProviderServices);
やvar instanceCe = SqlCeProviderServices.Instance;等と書いてみましたが変化ありません。

何か原因、対策方法などお分かりにならないでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

UserControl に限らず、貼り付けたコントロールは、デザイナ画面でコンストラクタが実行される為、

DesignerProperties.GetIsInDesignMode(this)

でデザインモードにいるかどうかを判定し、実行してもいいコード、良くないコードを分けちゃいましょう。

投稿2017/01/26 04:06

mugicya

総合スコア1046

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

propg

2017/01/27 07:43

ありがとうございます。 if文判定を入れることで、エラーは出ないようになりました。 コマンド側でも判定できるとは知らなかったため、参考になりました。 気になっていたのは、出ているエラーの内容ですが、デザイン上ではプロバイダーの認識は判定できないという理解をとりあえずしています。SQLServer Compact以外ならこのエラーは出ないかもしれません。
guest

0

イベントドリブンのようなので質問に対する回答にはなりませんが、
参考といたしましてMVVMでViewのコードビハインドではなくViewModelにロジックを記載していれば、
別途デバッグ用のViewModelインスタンスをDataContextにセットできますので
デザイナ実行時の業務ロジックをの実行を回避させることができます。

XML

1<UserControl ・・・ 2 d:DataContext="{d:DesignInstance local:XXXDebugViewModel,IsDesignTimeCreatable=True}"> 3・・・ 4</UserControl>

投稿2017/01/26 13:50

mikupedia

総合スコア159

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

propg

2017/01/27 07:45

ありがとうございます。 ViewModelをごっそり入れ替えてしまえばよいですね。 今回はコードビハインドで実装していたので、このやり方は適用できなかったのですが、 今後の参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問