MVC Code First (代码优先)

首先配置web.config

  <connectionStrings>
    <add name="BookDbContext" connectionString=" Data Source=.\SQLEXPRESS;Initial Catalog=sales;Persist Security Info=True;Integrated Security=SSPI;"
     providerName="System.Data.SqlClient" />
  </connectionStrings>

然后在Model里加入一个Book 类和一个BookDbContext类

Book类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace MvcApplication3.Models
{
    public class Book
    {
        public int BookID { get; set; }
        public string BookName { get; set; }
        public string Author { get; set; }
        public string Publisher { get; set; }
        public decimal Price { get; set; }
        public string Remark { get; set; }
    }
}

BookDbContext类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Entity;

namespace MvcApplication3.Models
{
    /// <summary>
    /// BookDbContext代表EF中Book在数据库中的上下文对象,通过DbSet<Book>使实体类与数据库关联起来。Books属性表示数据库中的数据集实体,用来处理数据的存取与更新。BookDbContext派生自DbContext,须要加入System.Data.Entity的引用。
    /// </summary>
    public class BookDbContext:DbContext
    {
        /// <summary>
        /// 表示用于运行创建、读取、更新和删除操作的类型化实体集。

DbSet 不是公共可构造的。仅仅能从 System.Data.Entity.DbContext实例创建。
        /// </summary>
        public DbSet<Book> Books { get; set; }
    }
}

加入一个Book控制器

要了解FormCollection请參考:FormCollection传值

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using MvcApplication3.Models;

namespace MvcApplication3.Controllers
{
    public class BookController : Controller
    {
        //
        // GET: /Book/

        BookDbContext db = new BookDbContext();

        /// <summary>
        /// //查询出全部的Book对象,组成一个Books,让它展示在页面首页
        /// </summary>
        /// <returns></returns>
        public ActionResult Index()
        {
            //这是一个简单的Linq查询,在对数据库进行操作时。EF会检查当前的数据连接指定的数据库是否被创建,假设没有则有EF负责依据实体模型类创建数据库、数据表;假设存在,EF会将查询条件加入到Sql查询语句,再将Sql语句发送到数据库进行数据读取。在完毕数据读取后,将数据转换为实体对象集合。

EF对数据库的操作大致如此
            var books = from b in db.Books
                        select b;
            return View(books.ToList());
        }

        [HttpGet]
        public ActionResult Create()
        {
            return View();
        }

        [HttpPost]
        public ActionResult Create(Book book)
        {

            //MVC验证中全部属性验证成功ModelState.IsValid等于true,仅仅要有一个验证不成功ModelState.IsValid就等于false 所以我们能够通过该属性来推断数据的有效性,但有时在数据验证时有时我们不须要验证全部的数据,比方登录时仅仅须要验证username及password格式是否输入正确就可以。使用下面方法能够排除要验证的字段:ModelState.Remove("Email");不验证Email。这样Email这个字段就不会被验证了,Email验证不通过ModelState.IsValid的值仍然是true

            if (ModelState.IsValid)
            {
                db.Books.Add(book);
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            else
            {
                return View(book);
            }

        }
        [HttpGet]
        public ActionResult Delete(int id)
        {
            var data = from DataItem in db.Books
                       where DataItem.BookID == id
                       select DataItem;
            ViewData.Model = data.Single();
            return View();
        }

        [HttpPost]
        public ActionResult Delete(int id, FormCollection c) //事实上这的FormCollection c 换成 int a=5 或者 int a=6 都是能够的。仅仅要保证这个Delete方法与上面的Delete方法參数不同就能够了。

事实上也就是保证两个方法构成重载
        {
            //Find()是返回满足条件的第一个元素,假设没有该元素,则返回null。

Book book = db.Books.Find(id); //也能够写成:Book book=db.Books.FirstOrDefault(d=>d.BookID==id)
            db.Books.Remove(book);
            db.SaveChanges();

            return RedirectToAction("Index");

        }

        public ActionResult Edit(int id)
        {
            //var data = from dataitem in db.Books
            //           where dataitem.BookID == id
            //           select dataitem;
            //ViewData.Model = data.Single();
            //return View();

            //Find()是返回满足条件的第一个元素(即:Books中 BookID的的值为id的Book),假设没有该元素。则返回null。
            Book book = db.Books.Find(id);
            if (book == null)
            {
                return RedirectToAction("Index");
            }
            return View(book);

        }
        [HttpPost]
        public ActionResult Edit(Book newbook)
        {
            try
            {
                Book oldbook = db.Books.Find(newbook.BookID);

                //使用来自控制器的当前值提供程序的值更新指定的模型实例
                UpdateModel(oldbook);

                //将在此上下文中所做的全部更改保存到基础数据库。

db.SaveChanges();
                return RedirectToAction("Index");

            }
            catch (Exception ex)
            {
                //AddModelError:将指定的错误消息加入到与指定键关联的模型状态字典的错误集合中。
                ModelState.AddModelError("", "改动失败。请查看具体错误信息" + ex.Message + ex.StackTrace);
            }
            return View(newbook);
        }

        public ActionResult Details(int id)
        {
            //Find()是返回满足条件的第一个元素(即:Books中 BookID的的值为id的Book),假设没有该元素,则返回null。
            Book book = db.Books.Find(id);
            if (book == null)
            {
                return RedirectToAction("Index");
            }
            return View(book);
        }

    }
}

view

Index 视图 首页

@model IEnumerable<MvcApplication3.Models.Book>
@{
    ViewBag.Title = "图书列表-MvcBook";
}
<h2>
    图书列表</h2>
<p>
    @Html.ActionLink("添加图书", "Create")
</p>
<table>
    <tr>
        <th>图书名称</th><th>作者</th><th>出版社</th><th>价格</th><th>备注</th>
    </tr>
    @foreach (var item in Model)
    {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.BookName)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Author)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Publisher)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Price)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Remark)
            </td>
            <td>
                @Html.ActionLink("编辑", "Edit", new { id = item.BookID }) |
                @Html.ActionLink("具体", "Details", new { id = item.BookID }) |
                @Html.ActionLink("删除", "Delete", new { id = item.BookID })
            </td>
        </tr>
    }
</table>

Create

@model MvcApplication3.Models.Book

@{
    ViewBag.Title = "Create";
}

<h2>添加</h2>

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)

    <fieldset>
        <legend>Book</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.BookName)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.BookName)
            @Html.ValidationMessageFor(model => model.BookName)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.Author)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Author)
            @Html.ValidationMessageFor(model => model.Author)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.Publisher)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Publisher)
            @Html.ValidationMessageFor(model => model.Publisher)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.Price)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Price)
            @Html.ValidationMessageFor(model => model.Price)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.Remark)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Remark)
            @Html.ValidationMessageFor(model => model.Remark)
        </div>

        <p>
            <input type="submit" value="添加" />
        </p>
    </fieldset>
}

<div>
    @Html.ActionLink("跳转到首页", "Index")
</div>

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

Delete

@model MvcApplication3.Models.Book

@{
    ViewBag.Title = "Delete";
}

<h2>Delete</h2>

<h3>Are you sure you want to delete this?</h3>
<fieldset>
    <legend>Book</legend>

    <table>
    <tr><th>图书名称:</th><th>@Html.DisplayFor(model => model.BookName)</th></tr>
    <tr><th>作者:</th><th>@Html.DisplayFor(model => model.Author)</th></tr>
    <tr><th>出版社:</th><th>@Html.DisplayFor(model => model.Publisher)</th></tr>
    <tr><th>价格:</th><th>@Html.DisplayFor(model => model.Price)</th></tr>
    <tr><th>备注</th><th>@Html.DisplayFor(model => model.Remark)</th></tr>
    </table>

</fieldset>
@using (Html.BeginForm()) {
    <p>
        <input type="submit" value="删除" /> |
        @Html.ActionLink("跳转到首页", "Index")
    </p>
}

Edit

@model MvcApplication3.Models.Book

@{
    ViewBag.Title = "Edit";
}

<h2>编辑</h2>

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)

    <fieldset>
        <legend>Book</legend>

        @Html.HiddenFor(model => model.BookID)

        <div class="editor-label">
            @Html.LabelFor(model => model.BookName)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.BookName)
            @Html.ValidationMessageFor(model => model.BookName)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.Author)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Author)
            @Html.ValidationMessageFor(model => model.Author)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.Publisher)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Publisher)
            @Html.ValidationMessageFor(model => model.Publisher)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.Price)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Price)
            @Html.ValidationMessageFor(model => model.Price)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.Remark)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Remark)
            @Html.ValidationMessageFor(model => model.Remark)
        </div>

        <p>
            <input type="submit" value="保存" />
        </p>
    </fieldset>
}

<div>
    @Html.ActionLink("跳转到首页", "Index")
</div>

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

Details

@model MvcApplication3.Models.Book

@{
    ViewBag.Title = "Details";
}

<h2>Details</h2>

<fieldset>
    <legend>Book</legend>
    <table>
    <tr><th>图书名称:</th><th>@Html.DisplayFor(model => model.BookName)</th></tr>
    <tr><th>作者:</th><th>@Html.DisplayFor(model => model.Author)</th></tr>
    <tr><th>出版社:</th><th>@Html.DisplayFor(model => model.Publisher)</th></tr>
    <tr><th>价格:</th><th>@Html.DisplayFor(model => model.Price)</th></tr>
    <tr><th>备注</th><th>@Html.DisplayFor(model => model.Remark)</th></tr>
    </table>
</fieldset>
<p>
    @Html.ActionLink("编辑", "Edit", new { id=Model.BookID }) |
    @Html.ActionLink("跳转到首页", "Index")
</p>

版权声明:本文博主原创文章。博客,未经同意不得转载。

时间: 2024-11-06 13:13:33

MVC Code First (代码优先)的相关文章

EF之Code First代码优先

1.前言 通过英文可知,表示的是代码优先,一般创建EF都是先创建数据库,创建根据数据库的EF实体模型,而code - first 则是反过来!... 2.代码实战 我们这次创建的不是原来的数据库EF设计器,而是空的Code first 模型.如果说你的项目引用中没有entity framkwork,则需要去nuget程序包中安装ef框架(entity) 创建一个类,这个类就是数据的上下文,它的目录在MVC项目中的Model文件夹,base中的是你所创建的数据库名称,而你创建的表也是在model的

MVC中EF代码优先问题

在练习Mvc项目时,提示如下数据库错误: The model backing the 'EFDbContext' context has changed since the database was created. Consider using Code First Migrations to update the database (http://go.microsoft.com/fwlink/?LinkId=238269). 按上述链接要求,在程序包管理控制台执行:Enable-Migra

MVC Code First (代码先行)

首先配置好web.config [html] view plain copy <connectionStrings> <add name="BookDbContext" connectionString=" Data Source=.\SQLEXPRESS;Initial Catalog=sales;Persist Security Info=True;Integrated Security=SSPI;" providerName="Sy

MVC学习之数据库开发模式:代码优先实例介绍

数据库开发模式之代码优先主要有以下几步: 1.在Models文件夹中创建需要的表所对应的类 2.创建数据上下文类 3.在webConfig文件中配置数据库连接节点 4.添加控制器和相应的视图文件 5.在控制器的动作中创建数据上下文实例,通过实例操作数据库数据 具体步骤如下所示: 1.在Models文件夹中创建所需表对应的类 namespace CodeFirst.Models { public class book { public int Id { get; set; } public str

ASP.NET MVC Code First 遇到的问题及解决方法

照抄大牛的Demo,自己信心满满地建好个各种项,结果死活不让通过,遇到了以下几个问题(大部分是自己作出来的...) 1.运行不起来,报错如下Error 26: SQL Server does not allow remote connections. (provider: SQL Network Interfaces, error: 26 - Error Locating Server/Instance Specified) 各种百度都是不行,后来看了一下,WebConfig的连接字符串是新加而

EF的代码优先设计

CodeFirst 用中文说是代码优先,此技术可以让我们先写代码,然后由Entity Framework根据我们的代码建立数据库 接下来用学生这个例子来演示,有学生表,课程表,和成绩表三张表 首先是Model层 学生表 using System; using System.Collections.Generic; using System.Linq; using System.Web; /**/ using System.ComponentModel.DataAnnotations;//验证 n

使用Entity Framework 4进行代码优先开发

[原文地址]Code-First Development with Entity Framework 4   .NET 4随带发布了一个改进版的Entity Framework(EF)- 一个位于System.Data.Entity命名空间的数据访问函数库. 当Entity Framework在.NET 3.5 SP1里第一次发布的时候,很多程序员给我们提供了反馈,指出他们认为在第一个版本中不足的地方.SQL团队积极听取这些意见,并且在.NET 4的版本里吸取了意见. EF4里一些重大改进包含有

(转)EF中数据优先,模型优先和代码优先

看了很多文章也不是很明白,说的都太书面化了,大家看看这图一下子就明白了,哈哈 其实看图很简单,database first和model first都是通过 data model创建的edmx文件,只不过model first模块可以自己根据需要创建和修改实体,显得更加灵活. codefist是一个class代码文件,它可以由一些第三方的软件可视化的创建,也是非常灵活的一种方式,目前被使用也是最广泛的. 二.Entity Framework Database first(数据库优先)使用过程 2.

在快速自定义的NopCommerce中使用实体框架(EF)代码优先迁移

我看到很多nopCommerce论坛的用户问他们如何使用Entity Framework(EF)代码优先迁移来自定义nopCommerce,添加新的字段和entites核心.我实际上在做nopCommerce定制项目时使用了很多EF Migrations,我必须说它在开发中有很大帮助. 今天,我将与大家分享如何在nopCommerce项目中做到这一点!我将使用nopCommerce 3.20作为例子,但你可以很容易地应用这个概念到其他的vesions! 原文链接:http://www.nopcn