LoginSignup
2
4

More than 5 years have passed since last update.

空のプロジェクトからASP.NET MVC5 EntityFramework6 for Oracleを試す(登録・更新・削除)

Last updated at Posted at 2016-05-30

はじめに

空のプロジェクトから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」フォルダ上で、右クリックをし「追加」、「コントローラー」を選択。
Add_Controller.png

「Entity Framework を使用した、ビューがある MVC コントローラー」を選択。
Add_Scaffolding.png

BookモデルとStandardContextコンテキストを設定します。コントローラ名は「BooksController」にします。前回の「BookListController」と分けるためです。
Add_Scaffolding2.png

これでControllersフォルダに「BooksController」とViewsフォルダに「Books」フォルダが自動生成されます。
Add_Scaffolding3.png

自動生成されたソースコード

BooksController
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_Create.png

ちなみにBooksテーブル関連を削除(※注意点を参照)した場合、イニシャライザ(StandardInitializer)クラスのSeedメソッドにて、データベースの中身をセットしているため、最初からデータが登録されている状態となります。
Books_Create3.png

Create New をクリック

Books_Create2.png

データを入力して、「Create」ボタンをクリックします。
入力したデータが反映されています。
Books_Index.png

Edit (編集)

Books_Edit.png

Details (詳細)

Books_Details.png

Delete (削除)

Books_Delete.png
「Delete」ボタンをクリックしても確認画面はないので即削除となります。

テーブル

Books_Table2.png

注意点

標準的なint型のIdを利用している場合、主キーは自動連番となります。
表以外にも索引とトリガーと順序が別途生成されます。
Idを使わない場合、「主キー項目は自動生成されない」にあるように、そのままでは動作しないので要注意

種類 名前
Books
索引 PK_Books
トリガー TR_Books
順序 SQ_Books

表のみを削除しても他が残っていると、「ORA-00955: すでに使用されているオブジェクト名です。」となって例外エラーとなってしまいます。

TR_Books
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;

順序:SQ_Books
Books_Seq.png

今後について

スキャフォールディングの作成は簡単にできることが分かった。実際にビジネスアプリケーションとして使うには、もっと作りこまないといけないけどね。
次は既にテーブルがある既存アプリケーションをASP.NET MVCで再構築する場合、どうやればいいのかについてやっていきたい。

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4