67

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

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

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());
                }
            }

誰かが私を助けることができれば、私はとても感謝しています:)

ありがとう。

4

8 に答える 8

112

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

FTPRuns.LastRunエンティティ キーからプロパティを除外するだけです。おそらく、これは偶然に発生したか、Entity Framework がデータベースから主キー情報を取得できず、エンティティ キーを推測する必要があったためです。たとえば、ビューには主キーがなく、Entity Framework はエンティティ キーをすべての非 null 列の組み合わせとして推測します。

于 2010-11-26T09:29:38.003 に答える
65

ダニエル・ブリュックナーのソリューションは私にとって完璧に機能しました! 以下は、基本的に彼が指示したものですが、グラフィック形式です-怠惰な読者に役立つかもしれません:)。

注意したいのは、モデル内の PK が

ここに画像の説明を入力

と呼ばれる PK があることがわかりますid。EF モデルを見ると、次のようになります。

ここに画像の説明を入力

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

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

ここに画像の説明を入力

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

于 2015-10-14T08:26:02.467 に答える
21

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

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

于 2010-12-16T18:28:25.123 に答える
15

edmx からテーブルを消去し (edmx で問題の原因となっているテーブルを選択 -> 右クリック - > 削除)、「データベースからモデルを更新」を実行しました。

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

于 2013-02-06T11:54:03.553 に答える
6

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

于 2016-05-14T13:42:10.147 に答える
3

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

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

于 2015-04-09T10:19:37.043 に答える
2

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

于 2013-05-03T12:27:52.327 に答える