| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5073 人关注过本帖
标题:摆脱ADO.NET瓶颈 手把手教你学习EF6到EF7(三)
取消只看楼主 加入收藏
wangnannan
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:87
帖 子:2546
专家分:9359
注 册:2007-11-3
结帖率:80.91%
收藏
 问题点数:0 回复次数:6 
摆脱ADO.NET瓶颈 手把手教你学习EF6到EF7(三)
接着上次讲的上面我们把模型准备好了,现在定义Controller。但在进行这一步前,我们需要Ctrl+Shift+B编译一下程序,以便系统知道我们之前定义好 的Blog类和BlogEntities类。右击Controllers文件夹选择Add->Controller打开添加Controller对 话框,将其命名为HomeController(MVC的Controller,当然你也可以随便命名,只不过在打开网页时需要手动输入路径),此刻数据 库还没有被创建,并且呆会自动创建后里面也是空的没有数据,我们需要向里面添加一些数据,所以这里模板我们选择带有CRUD(增删除改查)功能的,再将下 面的模型类选为Blog,上下文类选为BlogEntities,系统会自动实现CRUD操作,不用我们手动编写。
图片附件: 游客没有浏览图片的权限,请 登录注册

添加HomeController
图片附件: 游客没有浏览图片的权限,请 登录注册

搜索更多相关主题的帖子: 命名 文件夹 模型 网页 
2015-08-07 08:55
wangnannan
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:87
帖 子:2546
专家分:9359
注 册:2007-11-3
收藏
得分:0 
单击生成之后,生成的代码大概是这样:
图片附件: 游客没有浏览图片的权限,请 登录注册

程序代码:
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using using System.Web;
using System.Web.Mvc;
using MvcBlog.Models;

namespace MvcBlog.Controllers
{
    public class HomeController : Controller
    {
        private BlogEntities db = new BlogEntities();

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

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

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

        // POST: Home/Create
        // 为了防止“过多发布”攻击,请启用要绑定到的特定属性,有关

        // 详细信息,请参阅 http://go.
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create([Bind(Include = "BlogId,Title,CreateDate")] Blog blog)
        {
            if (ModelState.IsValid)
            {
                db.Blogs.Add(blog);
                db.SaveChanges();
                return RedirectToAction("Index");
            }

            return View(blog);
        }

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

        // POST: Home/Edit/5
        // 为了防止“过多发布”攻击,请启用要绑定到的特定属性,有关

        // 详细信息,请参阅 http://go.
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Edit([Bind(Include = "BlogId,Title,CreateDate")] Blog blog)
        {
            if (ModelState.IsValid)
            {
                db.Entry(blog).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            return View(blog);
        }

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

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

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



出来混,谁不都要拼命的嘛。 。拼不赢?那就看谁倒霉了。 。有机会也要看谁下手快,快的就能赢,慢。 。狗屎你都抢不到。 。还说什么拼命?
2015-08-07 08:58
wangnannan
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:87
帖 子:2546
专家分:9359
注 册:2007-11-3
收藏
得分:0 
视图已经自动添加在了Views文件夹下,到此我们的程序已经能够工作了,虽然我们似乎什么都没做。在运行前我们可以打开Sql server management studio (或者在VS里用服务器管理器连接到你本地的数据库)查看一下以确定数据库里还没有我们程序里需要的Blog表。然后我们Ctrl+F5运行网站。
图片附件: 游客没有浏览图片的权限,请 登录注册

页面显示出了我们在Blog中定义的Title字段和CreateDate字段,但由于还没有数据来进行显示,所以只有标题。
这个时候,我们断开数据库再重新连接,就会发现EF创建了一个程序命名空间为名称的数据库MvcBlog.Models.BlogEntities,里面包含我们用Dbset定义的Blogs表。表中的列也正好与我们在Blog类中定义的字段相对应。
注:vs2013链接SQL2014需要安装一个更新 具体参照这个帖子
http://www.


出来混,谁不都要拼命的嘛。 。拼不赢?那就看谁倒霉了。 。有机会也要看谁下手快,快的就能赢,慢。 。狗屎你都抢不到。 。还说什么拼命?
2015-08-07 10:39
wangnannan
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:87
帖 子:2546
专家分:9359
注 册:2007-11-3
收藏
得分:0 
仔细观察你会发现,它自动将BlogId定义为了主键,这是EF的convention在起作用,如果我们没有显示地指定数据库的连接字符串等配置信息,这些值将会遵从EF里的约定进行取值,比如这里的数据库名 MvcBlog.Models.BlogEntities。
图片附件: 游客没有浏览图片的权限,请 登录注册


出来混,谁不都要拼命的嘛。 。拼不赢?那就看谁倒霉了。 。有机会也要看谁下手快,快的就能赢,慢。 。狗屎你都抢不到。 。还说什么拼命?
2015-08-07 13:56
wangnannan
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:87
帖 子:2546
专家分:9359
注 册:2007-11-3
收藏
得分:0 
这样的名称当然不是我们想要的,而且,如果我们本地安装了多个数据库实例的话,我们也希望指定项目将数据创建在我们想要的实例当中。要覆盖默认的约定,我 们只需在Web.config(注意:不是Views文件夹下的Web.config)里添加一下对数据库的配置信息,代码如下:
程序代码:
 <connectionStrings>

    <add name="BlogEntities"
        connectionString="Data Source=(localdb)\v11.0;Initial Catalog=MvcBlog;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False;"
        providerName="System.Data.SqlClient"/>
  </connectionStrings>

 

  <appSettings>

出来混,谁不都要拼命的嘛。 。拼不赢?那就看谁倒霉了。 。有机会也要看谁下手快,快的就能赢,慢。 。狗屎你都抢不到。 。还说什么拼命?
2015-08-07 13:59
wangnannan
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:87
帖 子:2546
专家分:9359
注 册:2007-11-3
收藏
得分:0 
  注意上面的name应和Models中的定义的上下文类名称相同,这样才能使EF正常工作。server换成你本机数据库实例的名字。现在我们可以看到在先前那个数据库上方它生成了我们重新命名的数据库。

如图,数据库中已经保存了我们在页面上添加的数据。
图片附件: 游客没有浏览图片的权限,请 登录注册

  到这里大家已经看到了Code First 设计方式的大概过程。现在我们来回顾一下,之前所做的操作,将会更加明白这一过程是怎样进行的,特别是代码优先是如何做到在没有数据库支持的情况下先建立数据模型,然后再对数据库进行操作的。

  首先我们在Models中创建了所需要的数据模型Blog类,里面包含的字段将映射到以后数据库表中的相应列。

  接下来同样是在Models文件夹中,我们定义了一个最关键的BlogEntities上下文类,它继承自System.Data.Entity下的DbContext,它将我们的数据模型映射到数据库中,将代码中的数据持久化。

  最后,在页面上进行添加数据时,页面将表单数据通过Blog类型传回Controller里面相应的方法,这里是处理Post回传的 Create Action,它接收传回来的数据,通过调用db.SaveChanges()进行了数据的保存。这里db是BlogEntities上下文类的一个实 例。通过BlogEntities上下文类,我们进行的RUD操作将反应到数据库中,完成了从代码到数据库的更新过程。

 

 

出来混,谁不都要拼命的嘛。 。拼不赢?那就看谁倒霉了。 。有机会也要看谁下手快,快的就能赢,慢。 。狗屎你都抢不到。 。还说什么拼命?
2015-08-07 14:04
wangnannan
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:87
帖 子:2546
专家分:9359
注 册:2007-11-3
收藏
得分:0 
优点:没的说了 自动创建数据库 MODEL 随时添加修改 更新都很方便

出来混,谁不都要拼命的嘛。 。拼不赢?那就看谁倒霉了。 。有机会也要看谁下手快,快的就能赢,慢。 。狗屎你都抢不到。 。还说什么拼命?
2015-08-07 14:27
快速回复:摆脱ADO.NET瓶颈 手把手教你学习EF6到EF7(三)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022918 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved