Entity Framework EntityKey /外部キーの問題
-
06-07-2019 - |
質問
フォームの投稿の結果、新しいブランドレコードを保存しようとしています。私の見解では、Genderはドロップダウンであり、ViewData(" gender")から入力された整数を返します
次のようにリンクを設定しました:
gID = CInt(Request.Form("Gender"))
Brand.GenderReference.EntityKey = New EntityKey("DB_ENTITIES.Gender", "Id", gID)
TryUpdateModel(Brand)
DB.SaveChanges()
次のエラーが発生します。
Entities in 'DB_ENTITIES.Brand' participate in the 'FK_Brand_Gender' relationship. 0 related 'Gender' were found. 1 'Gender' is expected.
私にパラメータを英語で説明してもらえますか。また、DB.Genderを最初のパラメーターとして試しましたが、喜びはありません。
解決
EntityKeyを作成するのではなく、スタブGenderオブジェクトを作成します (申し訳ありませんが、C#ではVBの男ではありません):
Gender g = new Gender{ID = Int32.Parse(Request.Form("Gender"))};
次に、性別を適切な EntitySet
にアタッチします(性別エンティティを取得する DB
のプロパティの名前は以下の文字列です):
DB.AttachTo("Genders",g);
これにより、データベースは、性別が ObjectContext
にある状態になり、データベースクエリなしの未変更状態になります。これで、通常どおりに関係を構築できます
brand.Gender = g;
DB.AddToBrand(brand);
DB.SaveChanges();
これですべてです。 EntityKeys
これが役立つことを願って
他のヒント
必要なのは、BrandとGenderの両方のインスタンスで、Brand.GenderをGenderのインスタンスに設定します。その後、問題なく保存できます。
OKは、updateModelを使用する代わりに、私が思いついたことをここに示します。とにかく投稿に追加フィールドが追加される可能性があるため、問題があるか、潜在的にセキュリティ上のリスクがあるようです。 Genderの新しいインスタンスは、trygetObjectByKeyを介してインスタンス化できます。これは今のところ機能しています。 UpdateModelでGenderプロパティオブジェクトを更新するためのその他の提案を歓迎します。
Dim cID As Integer
cID = CInt(Request.Form("Gender"))
Dim key As New EntityKey(DB.DefaultContainerName() & ".Gender", "ID", cID)
Dim objGenderDS As New Gender
'Bring back the Gender object.
If DB.TryGetObjectByKey(key, objGenderDS) Then
Brand.GenderReference.EntityKey = key
Brand.Gender = objGenderDS
DB.AddToBrand(Brand)
DB.SaveChanges()
Else
End If