2016-07-05 69 views
0

私はこのエラーに関するいくつかの異なる質問を見ましたが、まったく私が経験しているものはありません。 MVTPパターンとEntity Framework(http://www.codeproject.com/Articles/873592/Tutorial-for-a-Basic-WPF-MVVM-Project-Using-Entity)の使い方を理解するために、CodeProject.comのシンプルなプロジェクトチュートリアルをたどりました。私はそれに直接従って、すべてが完璧に動作するように見えました。アプリケーション構成ファイルで 'x'という名前の接続文字列が見つかりませんでしたが、動作しますか?

しかし、私はちょっと好奇心を持って、いくつかのことを変え始めました。 XAMLで名前空間がどのように機能したかを知りたいので、MainWindowViewModelをViewModelsという名前の新しいフォルダに移動しました。それから私は、適切な場所で「VMS」と呼ばれる私のXAMLに新しい名前空間を追加し、ウィンドウのための私のデータコンテキストを設定します。

<Window x:Class="CpMvvMWithEntity.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:vms="clr-namespace:CpMvvMWithEntity.ViewModels" 
    xmlns:local="clr-namespace:CpMvvMWithEntity" 
    mc:Ignorable="d" 
    Title="MainWindow" Height="350" Width="525"> 

<Window.DataContext> 
    <vms:MainWindowViewModel /> 
</Window.DataContext> 

しかし、私はこれを行うとき、私はそのVisual Studioでライトブルーの下線警告が表示されます「アプリケーション設定ファイルに[myEntities]という名前の接続文字列が見つかりませんでした」と表示されます。しかし、App.configファイルには接続文字列があり、プログラムをビルドして実行すると、期待どおりに動作します。

これはなぜ起こっているのですか?

答えて

5

ビュー内でビューモデルのインスタンスを宣言しています。その結果、VSはエディタ内でクラスをインスタンス化し、VSプロセス内でコンストラクタコードを実行します。

コンストラクタがデータベースに接続しようとしています。現在実行中のプロセスのapp.configファイル内の接続文字列を探しています。現在実行中のプロセスはVisual Studioです。私はdevenv.exe.configファイルがあるとは信じません。もしあれば、あなたの接続文字列は間違いなくあります(そして、作成して、そこにあなたのコネクションを入れてください!)。

コードがエラーになり、エディタはUIコンポーネントからのエラーをキャプチャし、UIに警告を表示するように設計されています。それはあなたのコードのためにそれをしています。

解決策は、コンストラクタで作業を実行しないことです。あなたは本当にそこに長時間走っているオペをしてはいけません。どこにデータベースロジックを移動するかは、あなたとアプリケーションの設計によってのみ決定できます。

これを受け入れ、エラーをよりうまく処理する方法もあります。おそらく、欠落している接続文字列を記録します。あるいは、例外をキャッチして移動してください。そこで最高の設計決定ではありません。

もう1つの解決策は、この方法でDataContextを設定しないことです。コードビハインドで作成し、そこに割り当てます。そうすれば、to see if you're in the designerのチェックを実行し、プロセスをすべてスキップできます。

最後のオプション:害はなく、ファウルはありません。デザイナーのエラーを忘れるだけです。少なくともあなたのアプリケーションを害することはありません。より重要なタスクに移ります。

+0

ああ、わかりました。私のためにそれをクリアしてくれてありがとう。私は例のためにそれがちょうどそのように設計されたと思っていますが、その結果は私を混乱させました。 – Gaax

+0

検証するには、コンストラクタ内のメソッド呼び出しをコメントアウトしてエラーが消えて意味があります。私はまだ私がフォルダを動かすまでこれを見せていないのはなぜだろうかと思う。エラーが表示された後、私はVSを数回再起動しました。これは、Intellisenseキャッシュエラーまたは@OmegaManが話していたものと同様のものだと考えていましたが、それは解決していないようです。 – Gaax

0

エディタモードでのアプリケーションの作成と作業は、エディタの2つの異なるアクティビティです。エディタは、コードを正常にコンパイルすることができ、障害状態も同様に状態でコードを解析/構築する必要があります。毎回それを与える必要があります最終結果;あたかもアプリケーションをコンパイルして構築したかのように。あなたは完全なビルドコンパイルがアプリケーションを作成するために必要な部品で、あなたはそれが動作見るようにリンクする場所を移動しているので

は、新しいフォルダ

に私MainWindowViewModelを動かしました。しかしエディタの場合、トップレベルにあるMainWindowViewModelを解析しているときには、新しいレベルではなく親レベルにあるapp.configのキャッシュされたバージョンの場所がある可能性があります。

エディタ処理のヒューリスティックに関係なく、移動したファイルの現在の場所にファイルが見つからないことが原因です。

0

マイクロソフトはWebサイト上でEntity Frameworkの問題であると主張しています。しかし、私(と他の人)は何か奇妙なものを見つけました。エラーの原因となるファイルを閉じると、エラー自体も消えます。私はこれがVSの正常な振る舞いであるか、それ以外の理由が何であるかはわかりません。

コードビハインドにdatacontextを置き、XAMLファイルからdatacontextを削除すると、エラーもなくなり、まだコンパイルが正常に完了しています。

DataContext = new MainWindowViewModel(); 

私は常に空の私のコードビハインドを維持しようと、私は理解して何から、この場合とはなしマイナス面にはほとんどありません。

関連する問題