基于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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using System.Data.Entity;
using ContosoUniversity.Models;
using System.Data.Entity.ModelConfiguration.Conventions;
using System.Data.Entity.Infrastructure; namespace ContosoUniversity.DAL
{
public class SchoolContext:DbContext
{
private readonly static string CONNECTION_STRING = "name=WlfSys_EFCF_ConnString"; public DbSet<Student> Students { get; set; }
public DbSet<Enrollment> Enrollments { get; set; }
public DbSet<Course> Courses { get; set; } public SchoolContext()
: base(CONNECTION_STRING)//不写这个 默认的就是SchoolContext
{ } protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();//移除复数表名的契约 modelBuilder.Conventions.Remove<IncludeMetadataConvention>();//防止黑幕交易 要不然每次都要访问 EdmMetadata这个表 /* 可以删除的公约有:
Namespace:System.Data.Entity.ModelConfiguration.Conventions.Edm
• AssociationInverseDiscoveryConvention
寻找导航上互相引用的类的属性,并将它们配置为逆属性的相同的关系。
• ComplexTypeDiscoveryConvention
寻找有没有主键的类型,并将它们配置为复杂类型。
• DeclaredPropertyOrderingConvention
确保每个实体的主要关键属性优先于其他属性。
• ForeignKeyAssociationMultiplicityConvention
配置是必需的还是可选的关系基于为空性外键属性,如果包含在类定义中。
• IdKeyDiscoveryConvention
查找名为 Id 或 <TypeName> Id 的属性,并将他们配置作为主键。
• NavigationPropertyNameForeignKeyDiscoveryConvention
使用外键关系,使用 <NavigationProperty> <PrimaryKeyProperty> 模式作为属性的外观。
• OneToManyCascadeDeleteConvention
交换机上层叠删除,所需的关系。
• OneToOneConstraintIntroductionConvention
将配置为一个: 一个关系的外键的主键。
• PluralizingEntitySetNameConvention
配置为多元化的类型名称的实体数据模型中的实体集的名称。
• PrimaryKeyNameForeignKeyDiscoveryConvention
使用外键关系,使用 <PrimaryKeyProperty> 模式作为属性的外观。
• PropertyMaxLengthConvention
配置所有的字符串和字节 [] 属性,默认情况下具有最大长度。
• StoreGeneratedIdentityKeyConvention
配置默认情况下将标识所有整数的主键。
• TypeNameForeignKeyDiscoveryConvention
使用外键关系,使用 <PrincipalTypeName> <PrimaryKeyProperty> 模式作为属性的外观。 */ } }
}

详细的解释下这里

 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 代码优先的小例子 没什么难度~~ 但还是认真的写了下来 好累哦

本文章來源

http://www.cnblogs.com/wlflovenet/archive/2011/07/24/2115171.html

EF直接的一對多多對多多對一的關係----也即是鏈錶查詢的更多相关文章

  1. 使用EF自带的EntityState枚举和自定义枚举实现单个和多个实体的增删改查

    本文目录 使用EntityState枚举实现单个实体的增/删/改 增加:DbSet.Add = > EntityState.Added 标记实体为未改变:EntityState.Unchange ...

  2. EF中連表查詢的應用方式

    1.首先我們想讓列表頁顯示兩個表的共同數據 這裡有兩張表 public class mytype    {        public int mytypeID { get; set; }       ...

  3. EF经验分享_jimmyzzc

    刚刚接触EF,总结了一些在实际工作中的心德经验,与大家分享一下. 一.Excression表达式树 表达式目录树在LINQ中用于表示分配给类型为Expression<TDelegate>的 ...

  4. [Data Access] ORM 原理 (11): 效能議題

    這絕對是 ORM 的使用者,開發人員與 DBAs 共同想要問的議題,到底我使用了 ORM 和使用傳統的 ADO.NET 下 SQL 指令的方式會差多少? 這個問題不但會發生在 Entity Frame ...

  5. DNS 劫持、HTTP 劫持与 DNS 污染

    本文为本人的学习笔记,不保证正确. DNS 劫持 指DNS服务器被控制,查询DNS时,服务器直接返回给你它想让你看的信息.这种问题常为 ISP 所为. 由于一般的的电脑的 DNS 服务器 的配置都为自 ...

  6. Halcon算子函数

    Chapter_1_:Classification 1.1  Gaussian-Mixture-Models 1.add_sample_class_gmm 功能:把一個訓練樣本添加到一個高斯混合模型的 ...

  7. Informix SDK對比

    一.基本信息對比 表 1. Informix .NET Provider 和 IBM Data Server .NET Provider 的对比 特性 IBM Informix .NET Provid ...

  8. 同一個Loader對象傳入不同參數時,从数据库中查询的結果每次都一樣

    發現問題: LoaderManager().initLoader()方法調用時會根據第一個參數ID去判斷是否已經存在一個Loader加載器,如果存在則複 用,不存在則建一個新的加載器.由於我第一次已經 ...

  9. 1、ABPZero系列教程之拼多多卖家工具 前言

    此系列文章围绕着拼多多卖家工具来介绍ABPZero的使用,内容包括手机登录.手机注册.拼团提醒.微信公众号绑定帐号.有拼团发送消息到微信公众号(只要关注过微信公众号并已绑定系统帐号). 学习此系列必备 ...

随机推荐

  1. jQuery 自制上传头像插件-附带Demo实例(ajaxfileupload.js第三弹)

    这篇文章主要是对前两篇关于ajaxfileupload.js插件的文章 <ASP.NET 使用ajaxfileupload.js插件出现上传较大文件失败的解决方法(ajaxfileupload. ...

  2. [javaSE] 数据结构(栈)

    栈(stack)是一种线性存储结构,有以下特点: 1.栈中数据是按照先进后出的方式进出栈的 2.向栈中添加删除元素时,只能从栈顶进行操作 使用数组实现栈 定义一个类ArrayStack 实现入栈方法p ...

  3. Java基础(3)——变量

    从这篇文章起开始正式进入正题啦,本文将较为简单的介绍一下变量以及常量.变量,顾名思义,就是可以变的量,常量那么久相反了,常常不变的量就叫常量._(¦3」∠) 变量 在 Java 中,任何一个变量都得有 ...

  4. 06-码蚁JavaWeb之Servlet生命周期与基本配置

    学习地址:[撩课-JavaWeb系列1之基础语法-前端基础][撩课-JavaWeb系列2之XML][撩课-JavaWeb系列3之MySQL][撩课-JavaWeb系列4之JDBC][撩课-JavaWe ...

  5. Spring入门(二)— IOC注解、Spring测试、AOP入门

    一.Spring整合Servlet背后的细节 1. 为什么要在web.xml中配置listener <listener> <listener-class>org.springf ...

  6. js-js的运算

    ** js里面不区分整数和小数 var j = 123; alert(j/1000*1000); //在Java里面结果是0 //在js里面不区分整数和小数 123/1000 = 0.123 *100 ...

  7. 【Html基础】之<h1>~<h6> <p> <br> <hr>

    学习html无从下手,就在w3school的html手册按着教程学习了下. 什么是html? html是指超文本标记语言,即Hyper Text Markup Language html不是一种编程语 ...

  8. Android MVC模式和MVP模式的区别

    MVC模式: 1. MVC的所有通信都是单向的. 2. view传送指令到controller(用户也可以直接将指令传到controller). 3. controller完成业务逻辑后要求model ...

  9. PRINCE2的优势有哪些?

    PRINCE2之所以迅速发展的原因之一是许多企业认识到建立适合自己企业的项目管理标准是一项耗时耗财的工作. 他们至少要花费6-12个月.成千上万个工时来建立一套方法,而这只是最初的成本. 之后他们必须 ...

  10. spring事务的理解

    特性 一致性:业务处理要么都成功,要么都失败,不能部分成功不分失败 原子性:业务操作是由多个动作完成,这些动作不可分割,要么都执行,要么都不执行 隔离性:事务间之间要做隔离,不要互相影响 持久性:操作 ...