コンソールアプリケーションがあり、アプリケーションを実行するたびに、日付と時刻がデータベース内のテーブルに送信されるようにしています。
テーブル構造は次のようになります。
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());
}
}
誰かが私を助けることができるなら、私は非常に感謝します:)
ありがとう。
エンティティモデルには、エンティティキーとしてFTPRuns.ID
とFTPRuns.LastRun
の2つのプロパティの組み合わせがありますが、テーブルには主キーとしてFTPRuns.ID
列しかありません。そのため、モデルでは、FTPRuns.ID
とFTPRuns.LastRun
の組み合わせは一意である必要があり、データベースにはFTPRuns.ID
のみが一意であるという強力な要件があることを指定します。
エンティティキーからプロパティFTPRuns.LastRun
を除外するだけです。これは偶然に発生したか、Entity Frameworkがデータベースからプライマリキー情報を取得できず、エンティティキーを推測しなければならなかった可能性があります。たとえば、ビューには主キーがなく、エンティティフレームワークはすべてのNULL不可列の組み合わせとしてエンティティキーを推測します。
DanielBrückner ソリューションは完璧に機能しました!以下は基本的に彼が指示したものですが、グラフィカルな形式です-これは怠け者の読者に役立つかもしれません:)。
注目したいのは、モデルのPK、つまり.
id
というPKがあることがわかります。 EFモデルを見ると:
指定されたキーが1つだけ表示されますが、これは正しいです。私にとっては、そうではありませんでした。4列すべてがキーでした。
列を右クリックすると(VSのEFダイアグラムで)、Entity Key:
をチェック/選択解除するオプションが表示されます。
これがモデルと一致していることを確認してください。私の場合、id
のみをチェックし、プロジェクトを保存してビルドします。
これは、(データベース内の)テーブルのキーフィールドを変更し、エンティティモデルを更新したときに起こりました。
古いキーはモデル内に残っていたため、.edmxファイル内のオブジェクトのプロパティに移動し、キーをFalseに設定しました。それはそれを修正しました。
Edmxからテーブルを消去し(edmxで問題が発生するテーブルを選択->右クリック->削除)、「データベースから更新されたモデル」を実行します
それは私のためにそれを修正しました
モデルブラウザーからエンティティとクラスを削除し、データベースを更新して、テーブルが選択されていることを確認しました。これで問題は解決しました。
新しいテーブルを作成するときに主キーを設定するのを忘れていたので、それを行うためにSQL Management Studioに移動しました。完了したら、model.edmxファイルを更新して変更を反映し、3002エラーが発生しました。
モデルを更新するときに行ったのは、テーブルのすべての列を「エンティティキー」として設定することでした。そのため、model.edmxファイルを表示するときに、関連するテーブルを見つけ、さまざまなプロパティを右クリックして、主キーのみに[エンティティキー]が選択されていることを確認します。これで私の問題は解決しました。
Edmxからすべてのテーブルを消去してから、「データベースからモデルを更新」しました。また、データベースの所有者がいることを確認します。
テーブルの主キーが存在する場合、1).edmxファイルを開き、すべてのテーブルを選択してモデルから削除をチェックします。 2)DBからモデルを更新し、必要なすべてのテーブルを再度追加します