ASP.NET MVCでEntity Frameworkを使用する場合の問題
-
03-07-2019 - |
質問
エンティティフレームワークを使用して、ASP.NET MVCにデータアクセスレイヤーを実装します。 Viewで問題が発生しました。
VIEW内の私のコードが次のような場合:
実行時にエラーが発生しました:
オブジェクトの参照がオブジェクトのインスタンスに設定されていません。
説明:現在のWeb要求の実行中に未処理の例外が発生しました。エラーの詳細とコードのどこで発生したかについては、スタックトレースを確認してください。
例外の詳細:System.NullReferenceException:オブジェクト参照がオブジェクトのインスタンスに設定されていません。
ソースエラー:
14行目:
15行目:<!> lt;%= Model.FirstName%<!> gt; 16行目:
17行目:
これは、厳密に型指定されたビューテンプレートから生成されます。 モデル参照をweb.configに追加したことを確認しました LINQ to SQLを使用していたときにこのエラーは発生しませんでした
サポートが必要ですか
解決 2
わかりました! 問題はVIEWにありました 通常、それは using(Html.BeginForm(new {Id = Model.Id}))
データベースの主キーがCategoryIDである場合、コードを適応させる必要があると思われます
Id = Model.CategoryID
しかし、実際には、このようにする必要があります
using(Html.BeginForm(new {CategoryID = Model.CategoryID}))
それ以外の場合、モデルは生成されません。
復活、それが役立つことを願っています!
他のヒント
回答にコメントできないので、新しい回答でコメントします。 あなたの属性の名前は<!> quot; FirstName <!> quot;であることに気付きました。万が一このチュートリアル? そして、これはあなたが問題を抱えている編集アクションですか?
これは、私と2人のクラスメートが抱えているまったく同じ問題だからです。 問題のより詳細な説明は次のとおりです。
これはコントローラーアクションです:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(Contact contactToEdit) {
if (!ModelState.IsValid)
return View();
try {
var originalContact = (from c in base._entities.ContactSet
where c.Id == contactToEdit.Id
select c).First();
base._entities.ApplyPropertyChanges(originalContact.EntityKey.EntitySetName, contactToEdit);
base._entities.SaveChanges();
return RedirectToAction("Index");
} catch(Exception e) {
return View();
}
}
ApplyPropertyChangesが呼び出されると、例外が発生します。 (InvalidOperationException) 例外メッセージ:
{System.InvalidOperationException:ObjectStateManagerには、タイプ 'ContactManager.Models.Contact'のオブジェクトへの参照を持つObjectStateEntryが含まれていません。
System.Data.Objects.ObjectContext.ApplyPropertyChanges(String entitySetName、Object changed)
C:\ Users \ Jeroen \ Desktop \ ContactManager \ ContactManager \ ContactManager \ Controllers \ HomeController.cs:line 65}のContactManager.Controllers.HomeController.Edit(contact contactToEdit)で
ApplyPropertyChangesの前にこの行を追加すると:
System.Data.Objects.ObjectStateEntry x = base._entities.ObjectStateManager.GetObjectStateEntry(originalContact);
xには、正しいタイプのエントリが含まれています。 (デバッグイメージ)
注:チュートリアルから少し逸脱してエンティティオブジェクトをスーパークラスに配置したため、すべてのコントローラーで同じオブジェクトを宣言する必要はありません。しかし、チュートリアルに従うと同じ問題が発生します。
コントローラにモデルが適切に入力されていないようです。しかし、あなたの質問には本当に何が間違っているのかを解明するのに十分な情報がありません。
Model は、メソッド.FirstOrDefault()
を使用したselectステートメントが有効なオブジェクトをもたらさなかったため、nullである場合があります。
いつでも.First()
を<=>に変更して、ソリューションを再コンパイルできます。