はじめに
「空のプロジェクトからASP.NET MVC5 EntityFramework6 for Oracleを試す」の続きで登録・更新・削除を作成していきます。
参考にしたのは、「ASP.NET MVC5 Scaffolding ことはじめ」となります。
Scaffoldingとは
「Scaffolding」には足場という意味があります。
アプリケーションのスキャフォールディング (scaffolding) は開発者がオブジェクトの作成、 取得、更新、削除といった基本的なアプリケーションを定義、作成するためのテクニックとなります。
参考記事の注意点
この記事通りに作成すれば、SQL Server 2014 Expressで登録・更新・削除が出来るのですが、2点悩んだところがありました。
-
「There was an error running the selected code generator: Try rebuilding the project」のエラーについて
Scaffoldingでプログラムを自動生成するのですが、自動生成前にビルドしておく必要があります。 -
「’EntityState’ は、’System.Data.EntityState’ と ‘System.Data.Entity.EntityState” 間のあいまいな参照です。」の警告
「System.Data.Entity.EntityState.Modified;」を選択する。
スキャフォールディングの作成
今回はOracleなので前回のプロジェクトをそのまま使用しつつ、参考記事の見出し「scaffolding」の通りにやっていきます。
「Controllers」フォルダ上で、右クリックをし「追加」、「コントローラー」を選択。
「Entity Framework を使用した、ビューがある MVC コントローラー」を選択。
BookモデルとStandardContextコンテキストを設定します。コントローラ名は「BooksController」にします。前回の「BookListController」と分けるためです。
これでControllersフォルダに「BooksController」とViewsフォルダに「Books」フォルダが自動生成されます。
自動生成されたソースコード
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Net;
using System.Web;
using System.Web.Mvc;
using MvcBasic.Models;
namespace MvcBasic.Controllers
{
public class BooksController : Controller
{
private StandardContext db = new StandardContext();
// GET: Books
public ActionResult Index()
{
return View(db.Books.ToList());
}
// GET: Books/Details/5
public ActionResult Details(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Book book = db.Books.Find(id);
if (book == null)
{
return HttpNotFound();
}
return View(book);
}
// GET: Books/Create
public ActionResult Create()
{
return View();
}
// POST: Books/Create
// 過多ポスティング攻撃を防止するには、バインド先とする特定のプロパティを有効にしてください。
// 詳細については、http://go.microsoft.com/fwlink/?LinkId=317598 を参照してください。
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "id,Title,Price,ISBN,PublishDate")] Book book)
{
if (ModelState.IsValid)
{
db.Books.Add(book);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(book);
}
// GET: Books/Edit/5
public ActionResult Edit(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Book book = db.Books.Find(id);
if (book == null)
{
return HttpNotFound();
}
return View(book);
}
// POST: Books/Edit/5
// 過多ポスティング攻撃を防止するには、バインド先とする特定のプロパティを有効にしてください。
// 詳細については、http://go.microsoft.com/fwlink/?LinkId=317598 を参照してください。
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit([Bind(Include = "id,Title,Price,ISBN,PublishDate")] Book book)
{
if (ModelState.IsValid)
{
db.Entry(book).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(book);
}
// GET: Books/Delete/5
public ActionResult Delete(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Book book = db.Books.Find(id);
if (book == null)
{
return HttpNotFound();
}
return View(book);
}
// POST: Books/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public ActionResult DeleteConfirmed(int id)
{
Book book = db.Books.Find(id);
db.Books.Remove(book);
db.SaveChanges();
return RedirectToAction("Index");
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
db.Dispose();
}
base.Dispose(disposing);
}
}
}
確認
前回作成したBooksテーブルにはデータが残っているので、SQL Developerを使って一旦Booksテーブルのデータを削除します。
「http://localhost:52955/Books/」にアクセスします。
ちなみにBooksテーブル関連を削除(※注意点を参照)した場合、イニシャライザ(StandardInitializer)クラスのSeedメソッドにて、データベースの中身をセットしているため、最初からデータが登録されている状態となります。
Create New をクリック
データを入力して、「Create」ボタンをクリックします。
入力したデータが反映されています。
Edit (編集)
Details (詳細)
Delete (削除)
「Delete」ボタンをクリックしても確認画面はないので即削除となります。
テーブル
注意点
標準的なint型のIdを利用している場合、主キーは自動連番となります。
表以外にも索引とトリガーと順序が別途生成されます。
Idを使わない場合、「主キー項目は自動生成されない」にあるように、そのままでは動作しないので要注意
種類 | 名前 |
---|---|
表 | Books |
索引 | PK_Books |
トリガー | TR_Books |
順序 | SQ_Books |
表のみを削除しても他が残っていると、「ORA-00955: すでに使用されているオブジェクト名です。」となって例外エラーとなってしまいます。
create or replace trigger "TEST"."TR_Books"
before insert on "TEST"."Books"
for each row
begin
select "TEST"."SQ_Books".nextval into :new."id" from dual;
end;
今後について
スキャフォールディングの作成は簡単にできることが分かった。実際にビジネスアプリケーションとして使うには、もっと作りこまないといけないけどね。
次は既にテーブルがある既存アプリケーションをASP.NET MVCで再構築する場合、どうやればいいのかについてやっていきたい。