私は少し...奇妙な問題を抱えています。別のエンティティと*対1の関係を持つ新しく作成されたエンティティを保存するとエラーが発生します。説明するのは少し難しいですが、セットアップは次のとおりです。
(注:MVC 2-Entity Framework 4を使用しています)
私のエンティティは次のように設定されています(読みやすくするために名前が置き換えられていますが、構造は説明されているとおりです)。当社にはマネージャーが何人かいます。(tblManagers)各マネージャーは未定義の量のストア(tblStores)を所有しています。各店舗には、未定義の量の機器(tblEquipment)があります。したがって、私のDataModelは次のとおりです。
(tblManagers)1 <-----> *(tblStores)1 <------> *(tblEquipment)
(古いAccessファイルのエクスポートから)すでに多くのデータが含まれているため、この設定は有効です。
新しい機器を作成するときは、明らかに、それが属するストアを選択する必要があります。ドロップダウンリストで選択された値(ストアのID)は、次のコードを実行するHttpPostメソッドに渡されます。
dbは私のデータベースコンテキスト変数です
myNewItem.tblStore = db.tblStores.Single(x => x.Id == store_id_from_dropdown);
db.tblEquipments.AddObject(myNewItem);
db.SaveChanges();
これは私には有効なコードのようです。Resharperは問題を認識せず、コンパイルエラー(または警告)も認識しません。ただし、コードを実行すると、次の例外が発生します(db.SaveChanges()でスローされます)。
Entities in 'CMT_DevEntities.tbl_Stores' participate
in the 'tblManagerstblStores' relationship.
0 related 'tblManager' were found.
1 'tblManager' is expected.
コードにtblManagerへの参照がないため、なぜtblManagerを見ているのかわかりません。これは店長と店の関係と関係があることは理解していますが、その理由はわかりません。
これが私を混乱させる部分です:
- のdebugvaluesを
myNewItem
見ると、ストアがエンティティに追加されていることがわかります。ストアのtblManagerプロパティを確認することもでき、それは正しいtblManagerです。したがって、これにより、データベース内のすべてに問題がないことが確認されます(ストアには、マネージャーがない場合でも存在できませんでした)。 - 私は実際にコードの一部を省略しました。機器にはまったく同様のナビゲーションプロパティがあります(たとえば、サプライヤ。サプライヤには国へのナビゲーションプロパティがあります。関係はまったく同じです)。ただし、これについてはエラーは発生しません。ストア/マネージャーのもののみ。
私はおそらく何か、おそらく非常に単純なものが欠けています。いずれにせよ、なぜこれが起こっているのか私にはわかりません。
だから私の質問は:MVCのModelBinderによって作成されたエンティティとナビゲーションプロパティの(int)IDが与えられた場合、新しいエンティティをデータベースに追加するにはどうすればよいですか?