MVC 之 Code First
在我们的工作和学习当中,经常会遇到中小型项目,这些项目除了业务上的区别较大 外,对于底层和数据访问,其实都差不多。记得以前做项目时,每次都要重复的写底层操作数据库的代码,不仅浪费时间,也无太大意思,后来接触到了 Entity Framework,Linq等技术,发现底层原来可以这么简单,既缩短了大量的开发时间,又提高了代码质量。
今天就向大家演示两种搭建底层和技术,在此,也给自己做一个笔记。
CodeFirst,用中文说是代码优先,此技术可以让我们先写代码,然后由Entity Framework根据我们的代码建立数据库。一开始听上去很神奇,接下来,我将用图文并茂的方式,演示出来:
用学生的那个例子来演示的话,有三张表:学生表,课程表,和成绩表。于是,我们在建好的ASP.NET MVC 项目中的Model层,新建这样三个类
namespace CodeFirstDemo.Models
{
public class Course
{
[Key]
public int Id { get; set; } [Required]
[StringLength(50)]
public string Name { get; set; }
}
}
namespace CodeFirstDemo.Models
{
public class Student
{
[Key]
public int Id { get; set; } [Required]
[StringLength(50)]
public string Name { get; set; }
}
}
namespace CodeFirstDemo.Models
{
public class Score
{
[Key]
public int Id { get; set; } public Student Student { get; set; } public Course Course { get; set; }
}
}
如大家所想的那样,这三个类的属性其实就对应了数据库的表结构,值得一提的是,属性为的头上有"[Key]"或"[Required]"的标识,其 中[Key]表示在数据库中该字段为主键,[Required]表示不为空,[StringLength]也就是长度了。同时,在Model层和这种标 识,也用于客户端和后台的数据验证,MVC的这种模式,相比三层架构来看,着实方便了好多呀(这里只是本人愚见,WebForm中能不能用这种方式验证, 我也不知道额,这里留下一个标记,以后研究研究)。
接着,我们需要用上面写好的类来生成数据库了,这里我们要利用一个工具,叫EFCodeFrist,可以利用安装ASP.NET MVC 3时自带的NUGet管理器来搜索这个工具,然后点击安装,这当然是最方便的办法,可以一试,但是各种问题,各种安装不了,各种安装错误,很容易打击我们 的学习积极性,所以安装不了,我们可以去Visual Studio Gallery下载,其实,只需要引用一个叫做Entity Framework的dll类库即可,如图
,这一步完成之后,我们要建立一个StudentInfoEntities的类,这个类要继承自DbContext,而DbContext类在 System.Data.Entity命名空间下,该命名空间在没有引用EntityFramework.dll类库的前提下是无法using到的。我们 安装EFCodeFirst工具,也就是为了在VS每次创建项目的时候能自动的引用这个dll。
StudentInfoEntities类中的代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Entity; namespace CodeFirstDemo.Models
{
public class StudentInfoEntities : DbContext
{
public DbSet<Student> Students { get; set; } public DbSet<Course> Courses { get; set; } public DbSet<Score> Scores { get; set; }
}
}
最后,我们在Web.Config里配置一下数据库的连接字符串,
<connectionStrings>
<add name="StudentInfoEntities" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=StudentInfo;Integrated Security=True" providerName="System.Data.SqlClient"/>
</connectionStrings>
注意,name属性的值必须与继承自DbContext的类名一致,这样EntityFramework在web.config里才能找到正确的连 接字符串,从而访问数据库。如果不写连接字符串,或者name的值不同,EF也会尝试连接本地的数据库,不过生成的数据库名,会是项目 名.Models.StudentInfoEntities,一切取决于您了。
一切配置完成之后,就开始运行程序了,显然,当我们点击调试按钮之后,什么都没有发生。。。因为,我们需要一个触发条件,就是写一段读取数据库的代 码,这样,EF会根据web.config的连接来读取数据库,如果发现数据库中没有,才会自动创建它,如果已存在,则读取里面的数据并返回。
新建一个HomeController,在Index方法中加入代码:
namespace CodeFirstDemo.Controllers
{
public class HomeController : Controller
{
private StudentInfoEntities db = new StudentInfoEntities(); public string Index()
{
var data = db.Students.ToList();
return "Database is build success!";
} }
}
这样,再运行一个程序,当界面显示出字符的时候,去数据库看一下,数据库是不是自动生成了呢?
同时,您会发现,在Score表中,自动产生外键关系,是不是很方便呢。
喝水不忘挖井人,原博文:http://www.cnblogs.com/Alex-bg/archive/2012/10/20/2732300.html
MVC 之 Code First的更多相关文章
- 学习ASP.NET MVC(九)——“Code First Migrations ”工具使用示例
在上一篇文章中,我们学习了如何使用实体框架的“Code First Migrations ”工具,使用其中的“迁移”功能对模型类进行一些修改,同时同步更新对应数据库的表结构. 在本文章中,我们将使用“ ...
- IoC容器Autofac - Autofac + Asp.net MVC + EF Code First(转载)
转载地址:http://www.cnblogs.com/JustRun1983/archive/2013/03/28/2981645.html 有修改 Autofac通过Controller默认构造 ...
- MVC+EF CODE FIRST的使用
1创建标准MVC项目 2通过NuGet安装EF 3在Models文件夹中编写实体类 4创建EFDB上下文类 5在webconfig中创建连接字符串,其中name=EFDB上下文类名 6通过管理控制台执 ...
- 学习ASP.NET MVC(八)——“Code First Migrations ”工具
在本篇文章中,我们学习如何使用实体框架的“Code First Migrations ”(也称为代码先行功能)工具,使用其中的“迁移”功能对模型类进行一些修改,同时同步更新对应数据库的表结构. 默认情 ...
- 解决MVC EF Code First错误:Model compatibility cannot be checked because the EdmMetadata type was not included in the model.
Model compatibility cannot be checked because the EdmMetadata type was not included in the model. En ...
- MVC VS2012 Code First 数据库迁移教程
1.在“服务资源管理器”连接数据库 2.打开工具-Nuget程序包管理器“程序包管理器控制台” 3.控制台输入命令:PM> Enable-Migrations -StartUpProjectNa ...
- MVC中code first方式开发,数据库的生成与更新
在使用EF的实际编程中我们经常遇到这样的问题:发现实体结构需要新增加一个字段,或者减少一个字段,急需把实体结构修改,并让数据库更新这种修改.在用Model First或者Database First的 ...
- MVC, EF, Code First 相关问题总结
1. 控制表名单复数: 在DbContext类中修改OnModelCreating()为: protected override void OnModelCreating(DbModelBuilder ...
- Asp.net MVC 中Code First 迁移使用
如果模型类(数据库上下文类Context和POCO类)发生改变,与数据库中的结构不一致,系统默认会抛出一个异常.可以考虑使用代码优先迁移. 代码优先迁移执行UpSert数据库操作,它在每一次更新数据库 ...
随机推荐
- Programming Entity Framework 翻译(1)-目录
1. Introducing the ADO.NET Entity Framework ado.net entity framework 介绍 1 The Entity Relationship Mo ...
- RichEdit 追加 RTF
下面实现追加RTF 到 RichEdit 的功能其本质是:EM_STREAMIN 消息,详细查看 MSDN//--------------------------------------------- ...
- jsPlumb的简单使用
jsPlumb概述jsPlumb是一个在dom元素之间绘制连接线的javascript框架,它使用svg技术绘制连接线. 基本概念很明显,一个连线主要要解决的问题包括谁和谁连,在哪里连(连接点在哪里) ...
- vim 大全用法
vim中常用设置和操作: 在Linux系统下: 打开vi 文件: 0 数字0,跳转至行首 ^ 跳转至行第一个非空字符 $ 跳转至行尾 vim 括号匹配跳转操作: ctrl+] 跳转至函数或 ...
- 如何在真机装linux(本人在台式机上又添了个硬盘)
首先呢,本人就是小渣渣,所以对于装ubuntu在真机,刚开始真不知道如何下手,以前只是在虚拟机中装过,在经过查阅各种资料后,成功安装,我的台式机本身装的系统win7,是下面就是我安装的过程啦 1. 我 ...
- c语言-链表VS数组
数组和链表的区别 数组是将元素在内存中连续存放,由于每个元素占用内存相同,可以通过下标迅速访问数组中任何元素.但是如果要在数组中增加一个元素,需要移动大量元素,在内存中空出一个元素的空间,然后将要 ...
- 扫盲贴000---关于python中的if __name__ == '__main__'
对于python中的__name__变量,根据调用python文件的方式不同,__name__变量的值也会不同.假如我有一个名为hello_world.py的python脚本,当我的目的是直接运行这个 ...
- C#删除datable空行
//去除dataTable空行 public DataTable RemoveEmpty(DataTable dt) { List<DataRow> removelist = new Li ...
- -moz-transform: rotate(-5deg);
目前越来越多的浏览器兼容CSS3标准了,就连IE浏览器老大哥也开始向CSS3低头,微软宣布IE9浏览器支持更多的CSS3属性,IE9更注重 HTML5标准.不过CSS3里有一个使对象旋转的属性tran ...
- FP 某段SQL语句执行时间超过1个小时,并报错:ORA-01652: 无法通过 128 (在表空间 TEMPSTG 中) 扩展
一.出现如下两个错误:1.某一段SQL语句执行时间超过1个小时:2.一个小时后,提示如下错误:ORA-01652: 无法通过 128 (在表空间 TEMPSTG 中) 扩展 temp 段ORA-065 ...