5

私はwpfプロジェクト4.5を持っており、モデルクラスを生成するためにEF5を使用しています。生成されたEFクラスにiNotifyPropertyChangedを実装したいと思います。そこで、デザイナー(Visual Studio 2012)を右クリックして、コード生成設定を「なし」から「デフォルト」に変更しました。

それを行うと、次のような何百ものエラーが発生しました。

エラー67'パブリックプロパティ"TableColumnName" As "ColumnType"には、同一の署名を持つ複数の定義があります。

[編集1]

これらのエラーはすべてDataModel.Designer.Vbファイルでスローされます。これらは、別のテーブルのcolumn/navigationプロパティと同じ名前のテーブルcolumnプロパティまたはnavigationプロパティで発生します。同じ名前の異なるテーブルに列を含めることができないとは信じがたいです。ここで何か別のことが起こっているに違いありません。

[編集2]

そこで、すべてのデータベースオブジェクトをデザイナーから削除し、コード生成戦略をデフォルトに変更してから、1つのテーブル(クライアント)を図に追加しました。テーブルのすべてのプロパティで多くのエラーが発生します(したがって、他のテーブルの列名が以前に考えていたのと同じであるため、これが原因ではないはずです)。上記のすべてのプロパティ(テーブル列)でエラーが発生し、すべてのプロパティで次のエラーが発生します。

エラー変数'_ColumnName'は、クラス'client'のプロパティ'ColumnName'に対して暗黙的に宣言されたメンバーと競合します。C:... \ FTC_DAL.Designer.vb

これは、コード生成をnoneに戻すとなくなります。私はこれがEF5のバグだと思って見つめています。

[編集3]

再現する手順:

  1. Visual Studio 2012、wpfアプリケーションで新しいプロジェクトを作成します。
    それはvbまたはcである可能性があります、私は両方をテストしました
  2. ADO.NETエンティティデータモデル(edmxファイル)を追加します
  3. SQLサーバーからテーブルを追加します(Express 2008 R2を使用しています)
  4. プロジェクトをビルドし、空白のedmxデザイナーをクリックします。プロパティウィンドウで、コード生成戦略noneではなくdefaultに変更します。
  5. プロジェクトをビルドすると、エラーが表示されます。

使ってます:

  • Visual Studio 2012Prov.11.0.51106.01アップデート1
  • .NET 4.5.50709
  • Windows8プロ

SQL Server 2012 Expressをインストールして、これが違いを生むかどうかを確認します

誰かがこれらのエラーが発生している理由を理解するのを手伝ってもらえますか?

ありがとう

4

2 に答える 2

7

次のリンクを参照してください。私はこの問題に不満を感じることに多くの時間を費やし、「一部の...欠落している可能性があります」の直後に「ドメインサービスクラスの追加」画面に表示されるリンクからこのサポート記事を見つけました...

観察結果の要約は、WCF RIAがDBContext(.ttファイルで示される)をサポートしていないことです。Domainサービスクラスを使用するには、ObjectContextクラスが必要です。これがサポート記事からの解決策です。

WCF RIAサービスでEntityFrameworkモデルを利用するには、それを「ObjectContext」ベースのモデルに変換する必要があります。これは、次の手順を使用して実行できます。

  1. デザイナでエンティティモデルを開きます
  2. (必要に応じて、デザイナーの「空白」をクリックして、モデル内のオブジェクトが選択されていないことを確認します)
  3. [プロパティ]ウィンドウで、[コード生成戦略]を[なし]から[デフォルト]に変更します
  4. モデルに隣接する2つの「.tt」ファイルを削除します。エンティティモデルが作成されたときの元の状態を超えてこれらのファイルを変更していないことを前提としています。これらのファイルを変更した場合、エンティティモデルのカスタマイズは失われます。
  5. プロジェクトを再構築します

これらの手順を実行すると、[使用可能なコンテキストクラス]リストでエンティティモデルのコンテキストクラスを選択できるようになります。この手順の副作用は、エンティティモデルをEntityFrameworkDbContextベースのモデルからObjectContextベースのモデルに変換したことです。

于 2013-09-20T21:02:03.233 に答える
5

「なし」でのコード生成戦略は正しいので、そのままにしておく必要があります。

これを「デフォルト」に変更すると、モデル内のすべてのエンティティのクラスが取得されます。ただし、.ttテンプレートから同じクラスをすでに取得しています。その結果、すべてのクラスメンバーが2回取得されます。

クラスの生成方法を変更するには、デフォルトのコード生成はとにかくカスタマイズできないため、コード生成戦略を「なし」のままにしておきます。ファイルはニーズに合わせて自由に変更できます。クラスに必要なインターフェイスを実装させるために、Model.ttファイルを変更するのにそれほど手間はかかりません。

于 2013-02-14T18:00:04.043 に答える