takachaa / .net-Framework

0 stars 0 forks source link

【MVC】基本的なコントローラ CRUD #1

Open takachaa opened 7 years ago

takachaa commented 7 years ago

基本的なコントローラ CRUD

Scafold機能で作成したまんまのCRUDのコントローラ

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 MVCBasic3.Models;

namespace MVCBasic3.Controllers
{
    public class MembersController : Controller
    {
        private MvcBasic3Context db = new MvcBasic3Context();

        // GET: Members
        public ActionResult Index()
        {
            return View(db.Members.ToList());
        }

        // GET: Members/Details/5
        public ActionResult Details(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            Member member = db.Members.Find(id);
            if (member == null)
            {
                return HttpNotFound();
            }
            return View(member);
        }

        // GET: Members/Create
        public ActionResult Create()
        {
            return View();
        }

        // POST: Members/Create
        // 過多ポスティング攻撃を防止するには、バインド先とする特定のプロパティを有効にしてください。
        // 詳細については、https://go.microsoft.com/fwlink/?LinkId=317598 を参照してください。
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create([Bind(Include = "Id,Name,Email,Birth,Married,Memo")] Member member)
        {
            if (ModelState.IsValid)
            {
                db.Members.Add(member);
                db.SaveChanges();
                return RedirectToAction("Index");
            }

            return View(member);
        }

        // GET: Members/Edit/5
        public ActionResult Edit(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            Member member = db.Members.Find(id);
            if (member == null)
            {
                return HttpNotFound();
            }
            return View(member);
        }

        // POST: Members/Edit/5
        // 過多ポスティング攻撃を防止するには、バインド先とする特定のプロパティを有効にしてください。
        // 詳細については、https://go.microsoft.com/fwlink/?LinkId=317598 を参照してください。
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Edit([Bind(Include = "Id,Name,Email,Birth,Married,Memo")] Member member)
        {
            if (ModelState.IsValid)
            {
                db.Entry(member).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            return View(member);
        }

        // GET: Members/Delete/5
        public ActionResult Delete(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            Member member = db.Members.Find(id);
            if (member == null)
            {
                return HttpNotFound();
            }
            return View(member);
        }

        // POST: Members/Delete/5
        [HttpPost, ActionName("Delete")]
        [ValidateAntiForgeryToken]
        public ActionResult DeleteConfirmed(int id)
        {
            Member member = db.Members.Find(id);
            db.Members.Remove(member);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                db.Dispose();
            }
            base.Dispose(disposing);
        }
    }
}
takachaa commented 7 years ago

上記で重要な点をピックアップ

HTTPステータスだけを通知する 

HttpStatusCodeResult

以下

if (id == null)
{
       return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}

または「404 Not Found」に対応した以下のようなビューヘルパーでもかける

 if (member == null)
 {
        return HttpNotFound();
 }
takachaa commented 7 years ago

Entity FrameworkのSQLログを出力する

コントローラに以下のような記述を行うと

public BeginController(){
            db.Database.Log = (log) => Debug.WriteLine(log);
 }

※ちなみにコンストラクタ

Entity Frameworkが発行するSQLログを出力することができます。 出力されるログには以下の情報が含まれています。

・処理開始時間 ・処理内容 ・発行したSQL文 ・SQL文の処理時間

参考 http://tsubalog.hatenablog.com/entry/2015/07/06/110000

takachaa commented 7 years ago

削除の際のパフォーマンスを意識するやり方

よりパフォーマンスを重視するならばFindメソッドをデータの取得をスキップすることもできます。

var m = new Member(){Id = id};
db.Entry(m).State = EntityState.Deleted;
takachaa commented 7 years ago

Disposeメソッド

リクエスト処理を完了した後に、コンテキストを破棄して、データベースの接続を解放します。 正しく解放されないと、コネクションリーク(接続リーク)が発生する可能性があるためやっておきます。※接続を占有し続けてしまう状態のこと

 protected override void Dispose(bool disposing)
 {
            if (disposing)
            {
                db.Dispose();
            }
            base.Dispose(disposing);
}