web-dev-qa-db-ja.com

エラー3002:フラグメントのマッピングの問題|エンティティへのc#linq

コンソールアプリケーションがあり、アプリケーションを実行するたびに、日付と時刻がデータベース内のテーブルに送信されるようにしています。

テーブル構造は次のようになります。

FTPRuns

ID int

Last Run datetime

簡単です。

この新しい変更を反映するために、アプリケーション内のmodel.edmxも更新しましたが、次のエラーが表示され、その意味が完全にはわかりません。

エラー3002:1330行目からフラグメントをマッピングする際の問題:テーブルFTPRunsのキー(FTPRuns.ID)の潜在的なランタイム違反:列(FTPRuns.ID)は概念側でEntitySet FTPRunsのプロパティ(FTPRuns.ID)にマッピングされますが、そうではありませんEntitySetのキープロパティ(FTPRuns.ID、FTPRuns.LastRun)を形成します。

データベースの更新にも使用するコードの抜粋を次に示します。

 using (ModelContainer ctn = new ModelContainer())
            {
                try
                {
                    FTPRun ftp = new FTPRun
                    {
                        LastRun = DateTime.Now
                    };

                    ctn.FTPRuns.AddObject(ftp);

                    int changes = ctn.SaveChanges();

                    Console.WriteLine(changes.ToString() + " Changes saved");
                    Console.WriteLine("The LastRun Date Has Been Updated");
                }
                catch (InvalidOperationException ex)
                {
                     Console.WriteLine(ex.ToString());
                }
            }

誰かが私を助けることができるなら、私は非常に感謝します:)

ありがとう。

58
109221793

エンティティモデルには、エンティティキーとしてFTPRuns.IDFTPRuns.LastRunの2つのプロパティの組み合わせがありますが、テーブルには主キーとしてFTPRuns.ID列しかありません。そのため、モデルでは、FTPRuns.IDFTPRuns.LastRunの組み合わせは一意である必要があり、データベースにはFTPRuns.IDのみが一意であるという強力な要件があることを指定します。

エンティティキーからプロパティFTPRuns.LastRunを除外するだけです。これは偶然に発生したか、Entity Frameworkがデータベースからプライマリキー情報を取得できず、エンティティキーを推測しなければならなかった可能性があります。たとえば、ビューには主キーがなく、エンティティフレームワークはすべてのNULL不可列の組み合わせとしてエンティティキーを推測します。

93

DanielBrückner ソリューションは完璧に機能しました!以下は基本的に彼が指示したものですが、グラフィカルな形式です-これは怠け者の読者に役立つかもしれません:)。

注目したいのは、モデルのPK、つまり.

enter image description here

idというPKがあることがわかります。 EFモデルを見ると:

enter image description here

指定されたキーが1つだけ表示されますが、これは正しいです。私にとっては、そうではありませんでした。4列すべてがキーでした。

列を右クリックすると(VSのEFダイアグラムで)、Entity Key:をチェック/選択解除するオプションが表示されます。

enter image description here

これがモデルと一致していることを確認してください。私の場合、idのみをチェックし、プロジェクトを保存してビルドします。

42
benscabbia

これは、(データベース内の)テーブルのキーフィールドを変更し、エンティティモデルを更新したときに起こりました。

古いキーはモデル内に残っていたため、.edmxファイル内のオブジェクトのプロパティに移動し、キーをFalseに設定しました。それはそれを修正しました。

19
KevinDeus

Edmxからテーブルを消去し(edmxで問題が発生するテーブルを選択->右クリック->削除)、「データベースから更新されたモデル」を実行します

それは私のためにそれを修正しました

15
Dush

モデルブラウザーからエンティティとクラスを削除し、データベースを更新して、テーブルが選択されていることを確認しました。これで問題は解決しました。

5
Mitch Stewart

新しいテーブルを作成するときに主キーを設定するのを忘れていたので、それを行うためにSQL Management Studioに移動しました。完了したら、model.edmxファイルを更新して変更を反映し、3002エラーが発生しました。

モデルを更新するときに行ったのは、テーブルのすべての列を「エンティティキー」として設定することでした。そのため、model.edmxファイルを表示するときに、関連するテーブルを見つけ、さまざまなプロパティを右クリックして、主キーのみに[エンティティキー]が選択されていることを確認します。これで私の問題は解決しました。

3
DSF

Edmxからすべてのテーブルを消去してから、「データベースからモデルを更新」しました。また、データベースの所有者がいることを確認します。

2
danicode

テーブルの主キーが存在する場合、1).edmxファイルを開き、すべてのテーブルを選択してモデルから削除をチェックします。 2)DBからモデルを更新し、必要なすべてのテーブルを再度追加します

2
Madhava Reddy