[转]在ASP.NET MVC3中使用EFCodeFirst 1.0
本文转自:http://kb.cnblogs.com/page/97003/
作者: NinoFocus 来源: 博客园 发布时间: 2011-04-12 10:41 阅读: 11971 次 推荐: 11 原文链接 [收藏]
1. 新建项目
打开VS2010,选择 文件>新建>项目,新建ASP.NET MVC3 Web 应用程序,我这里把它命名为Blog。

2. 编写实体类
对于一个博客,一下几个类应该是必须的吧:
- Post 博客文章类
- Comment 文章评论类,和Post是一对多的关系
- Category 目录类,和Post是一对多的关系
- Tag 标签类,和Post是多对多的关系
- FriendLink 友情链接类
先不考虑管理员之类的东西。 在Model中依次添加上面的类。

namespace Blog.Models { public class Post { public int ID { get; set; } public int CategoryID { get; set; }
public string Title { get; set; } public string Summary { get; set; } public string Alias { get; set; } public string Content { get; set; } public DateTime CreateTime { get; set; }
public Category Category { get; set; } public ICollection<Tag> Tags { get; set; } public ICollection<Comment> Coments { get; set; } } }
namespace Blog.Models { public class Comment { public int ID { get; set; } public int PostID { get; set; } public int Level { get; set; } public int ReplyTo { get; set; }
public string UserName { get; set; } public string Email { get; set; } public string Website { get; set; } public string Content { get; set; } public DateTime CreateTime { get; set; }
} }
namespace Blog.Models { public class Category { public int ID { get; set; }
public string Name { get; set; } public string Alias { get; set; } public string Description { get; set; } public DateTime CreateTime { get; set; }
public ICollection<Post> Posts { get; set; } } }
namespace Blog.Models { public class Tag { public int ID { get; set; }
public string Name { get; set; } public string Alias { get; set; } public DateTime CreateTime { get; set; }
public ICollection<Post> Posts { get; set; } } }
namespace Blog.Models { public class FriendLink { public int ID { get; set; }
public string Name { get; set; } public string URL { get; set; } public string Description { get; set; } public DateTime CreateTime { get; set; } } }
3. 添加EFCodeFirst
选择菜单栏的 工具 > Library Package Magager > Package Manager Console。

在Package Manager Console中输入以下命令安装EFCodeFirst。
PM> install-package efcodefirst 。
安装成功后,VS会自动在你的项目中添加对EntityFramework的引用。
4. 配置
EFCodeFirst的配置是相当的简单,我们向Model中添加BlogDB类。
using System.Data.Entity;
namespace Blog.Models { public class BlogDB : DbContext { public DbSet<Post> Posts { get; set; } public DbSet<Tag> Tags { get; set; } public DbSet<Category> Categories { get; set; } public DbSet<Comment> Comments { get; set; } public DbSet<FriendLink> FriendLinks { get; set; } } }
打开web.config文件,添加链接字符串:
<connectionStrings> <add name="BlogDB" connectionString="Server=.\; Database=Blog;Trusted_Connection=true" providerName="System.Data.SqlClient" /> <!--<add name="BlogDB" connectionString="Server=.\EXPRESS; Database=Blog;Trusted_Connection=true" providerName="System.Data.SqlClient" />--> </connectionStrings>
注意,name属性的值为“BlogDB”这里和BlogDB这个类的类名保持一致。数据库名称为Blog(这个数据库现在并不存在)。
5. 小试牛刀
新建一个HomeController,添加如下代码。
using Blog.Models;
namespace Blog.Controllers { public class HomeController : Controller { BlogDB _db = new BlogDB(); // // GET: /Home/ public ActionResult Index() { var posts = _db.Posts; return View(posts); }
} }
给Index Action创建一个View,如下图示:

添加完后就迫不及待的果断的奋力的按下F5吧,让我们看看都发生了什么!

网页显示了如下信息,不过这不是今天的重点,今天的重点是数据库。让我们打开数据库看看,里面发生了什么。

看吧,EF自动的为我们创建了数据库。

而且,EF足够聪明的为我们完成了Posts到Tags的多对多联系!!!我们程序中并没有和TagPosts表对应的Model,有的只是如下的两行代码:
在Post类中:public ICollection<Tag> Tags { get; set; }
在Tag类中:public ICollection<Post> Posts { get; set; }
我们可以简单的使用如下的代码来获得标签“CSharp”中的所有文章。
var posts = _db.Tags .Where(t => t.Name == "CSharp") .Single() .Posts;
6. 修改Model后,自动更新数据表
当我们修改了Model后,运行网站时,会报错,因为EF现在不能把更新后的Model和旧数据表对应起来。为了使数据库随着Model的更新而更新,我们还要做以下的工作。
打开根目录下的Global.asax文件。
添加如下命名空间(注意:EFCodeFirst 1.0 和 0.8 对于 DataBase 类所在的命名空间不同)
using System.Data.Entity; using Blog.Models;
新建一个BlogDBInitializer类,使他继承DropCreateDatabaseIfModelChanges<BlogDB>,重写Seed函数。
public class BlogDBInitializer : DropCreateDatabaseIfModelChanges<BlogDB> { protected override void Seed(BlogDB context) { base.Seed(context); var links = new List<FriendLink> { new FriendLink{ Name="NinoFocus.com", URL=@"http://ninofocus.com", Description="NinoFocus的个人博客" }, new FriendLink{ Name="NinoFocus at CNBlogs", URL=@"http://www.cnblogs.com/nizhuguo", Description="NinoFocus在博客园的博客" } }; links.ForEach(l => context.FriendLinks.Add(l)); context.SaveChanges(); } }
向Application_Start()中,添加如下代码:

每次重建数据库后,数据库中的数据都是被清空。而Seed()函数的作用就是向新的数据库中添加以下初始化数据。
如上面的代码我添加了两个友情链接。
7. 写在最后
小弟也是刚学EF框架,可能还有很多地方我没注意到,或者说错了,请大家多多指教!
[转]在ASP.NET MVC3中使用EFCodeFirst 1.0的更多相关文章
- ASP.NET MVC3中Model验证
原文:ASP.NET MVC3中Model验证 概述 上节我们学习了Model的数据在界面之间的传递,但是很多时候,我们在数据传递的时候为了确保数据的有效性,不得不给Model的相关属性做基本的数据验 ...
- 在ASP.NET MVC3 中利用Jsonp跨域访问
在ASP.NET MVC3 中利用Jsonp跨域访问 在信息系统开发的时,根据相关业务逻辑难免会多系统之间互相登录.一般情况下我们需要在多系统之间使用多个用户名和密码.这样客户就需要在多个系统之间重复 ...
- Asp.net MVC3 中,动态添加filter
Asp.net MVC3 中,动态添加filter filter是attribute,不支持泛型,传入的参数必须是固定的值.总之很受attribute本身的限制. 发现一篇老外的文章,动态设置filt ...
- (转)在ASP.NET MVC3 中利用Jsonp跨域访问
原文地址:http://www.cnblogs.com/skm-blog/p/3431999.html 在信息系统开发的时,根据相关业务逻辑难免会多系统之间互相登录.一般情况下我们需要在多系统之间使用 ...
- 在ASP.NET MVC3 中利用JSONP跨域登录WEB系统
在信息系统开发的时,根据相关业务逻辑难免会多系统之间互相登录.一般情况下我们需要在多系统之间使用多个用户名和密码.这样客户就需要在多个系统之间重复登陆.每次登录都需要输入用户名和密码.最近比较流行的就 ...
- Asp.net MVC3中全局图片防盗链
怎么样在Asp.Net MVC3中做到全局图片防盗链?如果熟悉Asp.Net的页面生命周期,相信解决这个问题应该很容易.下面就演示一下如何去做? 一.首先是全局的,我们肯定要在Global.asax文 ...
- jQuery Uploadify在ASP.NET MVC3中的使用
1.Uploadify简介 Uploadify是基于jQuery的一种上传插件,支持多文件.带进度条显示上传,在项目开发中常被使用. Uploadify官方网址:http://www.uploadif ...
- ASP.NET MVC3中Controller与View之间的数据传递总结
一. Controller向View传递数据 1. 使用ViewData传递数据 我们在Controller中定义如下: ViewData["Message_ViewData& ...
- ASP.NET MVC3中Controller与View之间的数据传递
在ASP.NET MVC中,经常会在Controller与View之间传递数据,因此,熟练.灵活的掌握这两层之间的数据传递方法就非常重要.本文从两个方面进行探讨: 一. Controller向Vie ...
随机推荐
- Windows环境下QWT安装及配置
** 1.QWT下载路径 **:https://sourceforge.net/projects/qwt/ 主要下载这三个文件:qwt-6.1.2.zip.qwt-6.1.2.pdf,qwt-6.1. ...
- HDU 3080 The plan of city rebuild(prim和kruskal)
The plan of city rebuild Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java ...
- java的自动类型转换
package BaseType; /*java的自动类型提升和窄化转换 * * 1. 当一个char,short,byte类型的变量被赋值给一个超出他自身能表示的最大范围的数,java会自动将该数转 ...
- 嵌入式开发之davinci---dm8127 ipipe
http://blog.csdn.net/dog0138/article/details/4212576 http://e2e.ti.com/support/dsp/davinci_digital_m ...
- iOS 浅谈MVC设计模式及Controllers之间的传值方式
1.简述你对MVC的理解? MVC是一种架构设计.它考虑了三种对象:Model(模型对象).View(试图对象).Controller(试图控制器) (1)模型:负责存储.定义.操作数据 (2)视图: ...
- 当你使用LINQ做底层时,最好设计一个工厂,不要把LINQ的动作暴露给业务层
1: using System; 2: using System.Collections.Generic; 3: using System.Linq; 4: using System.Text; 5: ...
- BZOJ1087=Codevs2451=洛谷P1896&P2326互不侵犯
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2885 Solved: 1693[Submit][ ...
- c中的变量
1 变量类型 1.1 static global or static .data/.bss 1.2 automic stack,its relevant to os kernel and compil ...
- Android Studio集成Genymotion 及Genymotion 配置ADB
1.打开 Android Studio,依次[File]-[Settings],快捷键 Ctrl + Alt + S 2.在打开的 settings 界面里找到 plugins 设置项,点击右侧的“ ...
- eclipse 重启/打开内置浏览器
重启 Eclipse 重启选项允许用户重启 Eclipse. 我们可以通过点击 File 菜单选择 Restart 菜单项来重启 Eclipse. Eclipse 内置浏览器 Web 浏览器 Ecli ...