MVC3+EF4.1学习系列(一)-------创建EF4.1 code first的第一个实例

基于EF4.1 code first 简单的CRUD  园子中已经有很多了 ~~ 真不想再写这个了 可是为了做一个完整的小demo 从开始 到后面的一些简单重构 还是决定认真把这个写出来

争取写些别人没写到的东西~~ 好了 开始~~

这次要做的是个学校管理的demo(通俗些)

先建一个MVC3的应用程序  因为我们是code first 所以 开始创建实体类

一.创建Model

学生和学生成绩登记表是一对多的关系  一个学生可以有多次登记 (因为有多个课程)  一个课程也可以有多个登记   可以看出 其实就是 学生和课程 存在一个多对多的关系

为什么这么建立模型呢?这节主要不是讨论关系 关系这个会放到  第三节来讨论~~

现在开始创建学生的实体类

using System;using System.Collections.Generic;

namespace ContosoUniversity.Models{    public class Student    {        public int StudentID { get; set; }        public string LastName { get; set; }        public string FirstMidName { get; set; }        public DateTime EnrollmentDate { get; set; }        public virtual ICollection<Enrollment> Enrollments { get; set; }    }}

在这里面 这个StudentID将被默认的设为主键  EF将会默认的给名字为ID的或者带ID的设置为主键

Enrollments是一个导航属性  将做为外键    导航属性定义为virtual 以便于实现延迟加载 

  接下来 创建登记录入表(关系表)的实体类 

using System;using System.Collections.Generic;

namespace ContosoUniversity.Models{    public class Enrollment    {        public int EnrollmentID { get; set; }        public int CourseID { get; set; }        public int StudentID { get; set; }        public decimal? Grade { get; set; }        public virtual Course Course { get; set; }        public virtual Student Student { get; set; }    }}

这里面 我们的成绩是可空类型     学生实体有多个 Enrollment 而Enrollment有一个学生实体的导航属性 这里面 我们既有学生ID 又有学生实体属性 我们会担心 会不会生成两个呢StudentID?不用担心 EF很聪明 在关系表里 只有一个studentID

接下来就是创建课程实体了

using System;using System.Collections.Generic;

namespace ContosoUniversity.Models{    public class Course    {        public int CourseID { get; set; }        public string Title { get; set; }        public int Credits { get; set; }        public virtual ICollection<Enrollment> Enrollments { get; set; }    }}

OK了 实体创建好了 接下来 我们要创建一个 数据库上下文

二.Creating the Database Context

这个类主要是把上面创建的实体类包含再里面  指定哪些实体类包含在我们的数据模型中 还有 这个类可以指定我们的映射关系 还可以指定一些生成的约束关系总之 很有用的

这里面 我们先创建一个DAL的文件夹 然后在下面新建一个类 叫做SchoolContext  并且继承DbContext

详细的解释下这里

 private readonly static string CONNECTION_STRING = "name=WlfSys_EFCF_ConnString";
 public SchoolContext()            : base(CONNECTION_STRING)//不写这个  默认的就是SchoolContext        {

}

上面这里是配置连接字符串  默认的就是SchoolContext 即你这个context的名字

protected override void OnModelCreating(DbModelBuilder modelBuilder)        {

modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();//移除复数表名的契约

modelBuilder.Conventions.Remove<IncludeMetadataConvention>();//防止黑幕交易 要不然每次都要访问 EdmMetadata这个表

}

再重写的这个方法里 我们可以移除一些契约  还可以配置数据库映射关系  常用的移除信息 都写在里面了

三.设置连接字符串

 <connectionStrings>    <add name="WlfSys_EFCF_ConnString"        providerName="System.Data.SqlClient" connectionString="Data Source=.;Initial Catalog=WLFSchool;Integrated Security=True;Pooling=False" />  </connectionStrings>

我们的这个名字 和上面设置的一直~~(那个英文博客里用的是 SQL Server Compact database 但为了让项目贴近实际 我这里用SQL2005)

四.数据库数据初始化

在DAL下 新建一个类 SchoolInitializer  继承自 DropCreateDatabaseIfModelChanges<SchoolContext>  这个类主要实现 数据库数据初始化 方便测试~~

using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Data.Entity;//记得引用命名空间using ContosoUniversity.Models;

namespace ContosoUniversity.DAL{    public class SchoolInitializer : DropCreateDatabaseIfModelChanges<SchoolContext>    {

protected override void Seed(SchoolContext context)        {            var students = new List<Student>            {                new Student { FirstMidName = "Carson",   LastName = "Alexander", EnrollmentDate = DateTime.Parse("2005-09-01") },                new Student { FirstMidName = "Meredith", LastName = "Alonso",    EnrollmentDate = DateTime.Parse("2002-09-01") },                new Student { FirstMidName = "Arturo",   LastName = "Anand",     EnrollmentDate = DateTime.Parse("2003-09-01") },                new Student { FirstMidName = "Gytis",    LastName = "Barzdukas", EnrollmentDate = DateTime.Parse("2002-09-01") },                new Student { FirstMidName = "Yan",      LastName = "Li",        EnrollmentDate = DateTime.Parse("2002-09-01") },                new Student { FirstMidName = "Peggy",    LastName = "Justice",   EnrollmentDate = DateTime.Parse("2001-09-01") },                new Student { FirstMidName = "Laura",    LastName = "Norman",    EnrollmentDate = DateTime.Parse("2003-09-01") },                new Student { FirstMidName = "Nino",     LastName = "Olivetto",  EnrollmentDate = DateTime.Parse("2005-09-01") }            };            students.ForEach(s => context.Students.Add(s));            context.SaveChanges();

var courses = new List<Course>            {                new Course { Title = "Chemistry",      Credits = 3, },                new Course { Title = "Microeconomics", Credits = 3, },                new Course { Title = "Macroeconomics", Credits = 3, },                new Course { Title = "Calculus",       Credits = 4, },                new Course { Title = "Trigonometry",   Credits = 4, },                new Course { Title = "Composition",    Credits = 3, },                new Course { Title = "Literature",     Credits = 4, }            };            courses.ForEach(s => context.Courses.Add(s));            context.SaveChanges();

var enrollments = new List<Enrollment>            {                new Enrollment { StudentID = 1, CourseID = 1, Grade = 1 },                new Enrollment { StudentID = 1, CourseID = 2, Grade = 3 },                new Enrollment { StudentID = 1, CourseID = 3, Grade = 1 },                new Enrollment { StudentID = 2, CourseID = 4, Grade = 2 },                new Enrollment { StudentID = 2, CourseID = 5, Grade = 4 },                new Enrollment { StudentID = 2, CourseID = 6, Grade = 4 },                new Enrollment { StudentID = 3, CourseID = 1            },                new Enrollment { StudentID = 4, CourseID = 1,           },                new Enrollment { StudentID = 4, CourseID = 2, Grade = 4 },                new Enrollment { StudentID = 5, CourseID = 3, Grade = 3 },                new Enrollment { StudentID = 6, CourseID = 4            },                new Enrollment { StudentID = 7, CourseID = 5, Grade = 2 },            };            enrollments.ForEach(s => context.Enrollments.Add(s));            context.SaveChanges();

}    }}

这样还没有完 还要再 Global.asax 下的Application_Start()加上如下代码

 Database.SetInitializer<SchoolContext>(new SchoolInitializer());

五.创建控制器

创建好后添加

    private SchoolContext db = new SchoolContext();

再在Index方法下添加得到所有学生的方法

public ViewResult Index(){    return View(db.Students.ToList());}

六.添加视图(小谈MVC的 DISPLAY)

@model IEnumerable<ContosoUniversity.Models.Student>

@{    ViewBag.Title = "Students";}

<h2>Students</h2>

<p>    @Html.ActionLink("Create New", "Create")</p><table>    <tr>        <th></th>        <th>Last Name</th>        <th>First Name</th>        <th>Enrollment Date</th>    </tr>

@foreach (var item in Model) {    <tr>        <td>            @Html.ActionLink("Edit", "Edit", new { id=item.StudentID }) |            @Html.ActionLink("Details", "Details", new { id=item.StudentID }) |            @Html.ActionLink("Delete", "Delete", new { id=item.StudentID })        </td>        <td>            @Html.DisplayFor(modelItem => item.LastName)        </td>        <td>            @Html.DisplayFor(modelItem => item.FirstMidName)        </td>        <td>            @Html.DisplayFor(modelItem => item.EnrollmentDate)        </td>    </tr>}

</table>

好了 视图添加完了 这里面 我们用了 Html.DisplayFor  刚看到这个时 总是不明白这个到底显示什么 还有实体类上 总是加上display(name="")这样的特性 但是又和这个没关系 让我很郁闷

查了MSDN和相关资料 终于明白  Html.DisplayFor 可以算是显示模版 显示实体类的特性[DataType(DataType.Password)] 这样显示的就是密码框   而 display(name="")这样的特性  则是让 Html.LabelFor()去显示的  display的具体的 可以看下这个文章 介绍的不错display模版详细介绍

七.运行环境 查看结果

大家一定很关心数据库的生成什么样子滴~~

EdmMetadata 数据库记录个版本对照 可以不要 在契约里有删除~~用站长dudu的话 防止黑幕交易

八.总结

很简单的创建一个EF4.1 代码优先的小例子 没什么难度~~ 但还是认真的写了下来 好累哦

下一节 讲基本的增删改查操作 以及中间发生的状态的变更

时间: 2024-08-07 17:01:18

MVC3+EF4.1学习系列(一)-------创建EF4.1 code first的第一个实例的相关文章

我的Android 4 学习系列之创建应用程序和Activity:Manifest、Application、Activity

目录 介绍Android应用程序组件,以及使用这些组件构建的各种Android应用程序 Android应用程序的生命周期 如何创建应用程序Manifest 如何使用外部资源提供对位置.语言和硬件配置的支持 如何实现和使用自己的Application类 如何创建新的Activity 理解Activity的状态转换和生命周期 Android应用程序的组成部分 Android应用程序是由松散耦合的组件构成的,并使用应用程序Manifest绑定到一起. Manifest描述了每一个组件以及他们之间的交互

idea新手学习系列之创建maven web项目

idea开发系列教程(-)-创建maven webapp项目 可能大家在学习web的时候使用最多就是myeclipse和eclipse,我也是,我个人比较喜欢myeclipse,因为他会自加载xmlcatlog,eclipse貌似不会,每次我都得自己配置本地,但是作为向web进军的学习者,我们止步于ide的限制,作为开发者,我们不应该纠结于那种工具最好,那种是坨屎,我们应该关注的我们需要的功能,所以,不管那种工具,我们都有必要去了解一下,以下是我的学习心得: 1.首先安装idea,建议大家使用1

MVC3+EF4.1学习系列(二)-------基础的增删改查和持久对象的生命周期变化

上篇文章中 我们已经创建了EF4.1基于code first的例子  有了数据库 并初始化了一些数据  今天这里写基础的增删改查和持久对象的生命周期变化 学习下原文先把运行好的原图贴来上~~ 一.创建详细页 首先 我们先在控制器下 添加详细页的方法 因为这篇文章后面要介绍持久对象声明周期的变化 所以在这里先看下有哪些状态 EF里一共有这五中生命状态类型 其实 看名字我们可以大概猜测出个一二三来~~  游离的 未改变的  新添加的  已删除的 修改的  但是是怎么变化的能 我们在后面的代码中实践与

MVC3+EF4.1学习系列(十一)----EF4.1常见的问题解决

博客写了10篇了~有很多朋友私信问了一些问题,而且很多问题 大家问的都一样 这里说说这些常见问题的解决办法.如果大家有更好的解决办法~也希望分享出来 问题大概为这几个 一.ef4.1 codeFirst 修改表结构 增加字段等 EF code first需要重新生成库导致数据丢失的问题. 二.ef4.1 没有了edmx等复杂的东西 变得简单 干净  但如何使用存储过程,存储过程可以返回表 可以返回数值 也有可能是执行修改 删除 增加等  该怎么做? 三.ef4.1 如何使用数据库视图?每个视图都

MVC3+EF4.1学习系列(五)----- EF查找导航属性的几种方式

通过上一篇的学习 我们把demo的各种关系终于搭建里起来 以及处理好了如何映射到数据库等问题 但是 只是搭建好了关系 问题还远没有解决 这篇就来写如何查找导航属性 和查找导航属性的几种方式 已经跟踪生成的SQL来检测是否满意 通过这节学习 来明白什么时候用哪个~~ 一.三种加载 1.延迟加载 这是原文中的图 大家可以去看下  我模仿上面的做了个测试  出现了  已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭. 我的解决办法是    var departments

MVC3+EF4.1学习系列(七)-----EF并发的处理

看这篇文章之前 推荐园子里的 这个文章已经有介绍了 而且写的很好~~ 可以先看下他的 再看我的 并发 1.悲观并发 简单的说 就是一个用户访问一条数据时 则把这个数据变为只读属性  把该数据变为独占 只有该用户释放了这条数据 其他用户才能修改 这期间如果该用户上个厕所 出去玩一圈 没有退出 则其他人都要等很久 很显然 这不是我们期望的效果  也不是这篇文章讨论的重点 2.乐观并发 乐观并发相对悲观并发,用户读取数据时不锁定数据.当一个用户更新数据时,系统将进行检查,查看该用户读取数据后其他用户是

MVC3+EF4.1学习系列(九)-----EF4.1其他的一些技巧的使用

上节通过一系列重构 简单的项目就实现了 不过还有些EF的功能没有讲 这节就通过项目 讲讲EF其他的功能与技巧 一.直接执行SQL语句 通常来讲 EF 不用写SQL语句的  但是 在有些场合  比如对生成的SQL语句 觉得不满意 要做优化  或者做报表统计时 要写很变态的SQL语句 再或者 批量操作等   这个时候 使用ORM的弱点就显露了出来 但是 做为优秀的ORM框架  EF 是支持原生态的SQL的   这里面 提供了三种方法 1. DbSet.SqlQuery   有跟踪状态的查询  2. 

MVC3+EF4.1学习系列(八)-----利用Repository and Unit of Work重构项目

项目最基础的东西已经结束了,但是现在我们的项目还不健全  不利于测试 重复性代码多   层与层之间耦合性高  不利于扩展等问题.今天的这章 主要就是解决这些问题的.再解决这些问题时,自己也产生了很多疑问,理解的也并不是很透彻 ,希望我的疑问能在这里得到解答~~ 一.模式介绍 1.Repository 在<企业架构模式>中,通过用来访问领域对象的一个类似集合的接口,在领域与数据映射层之间进行协调.还有请大家参考这个  P OF EAA详细介绍 然后说下我对这个的感觉和疑问   怎么都觉得这个Re

MVC3+EF4.1学习系列(十)----MVC+EF处理树形结构

通过前几篇文章 我们处理了 一对一, 一对多,多对多关系 很好的发挥了ORM框架的做用 但是 少说了一种 树形结构的处理, 而这种树形关系 我们也经常遇到,常见的N级类别的处理, 以及经常有数据与类别挂钩.今天主要写下EF处理树形结构以及 MVC如何展示树形结构. 前面几篇的例子 一直用的是一个例子,内容是连贯的.这篇是完全单独的~ 先来说下工作中会遇到的常见场景 针对这几个场景来处理~ 1.类别 a.类别可以有无限级别 b.类别的最末端 不确定是第几级 某个节点 可以到二级 其他的节点 有可能