1.建立MVC项目》NuGet安装EF
2.建立模型:
public class Blog { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public Guid Id { get; set; } public string Title { get; set; } public string Author { get; set; } public DateTime Time { get; set; } public string Summary { get; set; } public string Content { get; set; } public virtual ICollection<Comment> Comments { get; set; } = new List<Comment>(); } public class Comment { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public Guid Id { get; set; } public string VisitorName { get; set; } public string Email { get; set; } public DateTime Time { get; set; } public string Content { get; set; } [ForeignKey("Blog")] public Guid BlogId { get; set; } public virtual Blog Blog { get; set; } }
模型需要引用命名空间:
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
3.建立数据库类 DbContext:
public class EFDbContext : DbContext { public DbSet<Product> Products { get; set; } public DbSet<Blog> Blogs { get; set; } public DbSet<Comment> Comments { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); //去除“设置表名为复数”这条约定 } }
DbContext需要引用命名空间:
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration.Conventions;
4.配置web.config数据库连接,连接名称需要是EFDbContext,和建立的DbContext名称一致;或者在EFDbContext中使用构造函数指定连接名称:
public EFDbContext() : base("数据库链接的结点名字") { }
<add name="EFDbContext" connectionString="Data Source=.;Initial Catalog=db_codefirst_test;Persist Security Info=True;User ID=sa;Password=123456;" providerName="System.Data.SqlClient" />
记得加上:providerName="System.Data.SqlClient"
5.新建一个测试Controller,选择具有增删改查的模板,然后选择对应的模型类、数据库上下文类。
6.运行程序,浏览刚才建的Controller的View,数据库就自动建好了。
7.要是修改模型类,数据库中的表需要删了重建。
8.可自动根据模型变化重新建库,并插入初始化数据,选择不同模式即可。
DropCreateDatabaseIfModelChanges:当模型改变时,重新建库;
DropCreateDatabaseAlways:每次启动程序时,重新建库;
Seed方法用来插入数据。
/// <summary> /// 数据库初始化 /// </summary> public class BaseInitializer : DropCreateDatabaseIfModelChanges<EFDbContext> { //CreateDatabaseIfNotExists:数据库不存在时重新创建数据库 //DropCreateDatabaseIfModelChanges:当模型改变时,重新建库; //DropCreateDatabaseAlways:每次启动程序时,重新建库; protected override void Seed(EFDbContext context) { var blogs = new List<Models.Blog> { new Models.Blog{ Author="小明", Content="老师:小明,你给我滚出去!", Time=DateTime.Now, Title="小明日常", Comments=new List<Models.Comment>(){ new Comment(){ Content = "test", Email="908085411@qq.com", Time=DateTime.Now, VisitorName="jay.x" } } }, new Models.Blog{ Author="小红", Content="老师:小红,你去看看小明去哪儿了!", Time=DateTime.Now, Title="小红日常"}, new Models.Blog{ Author="小蓝", Content="小蓝:老师,小明和小红在玩游戏!", Time=DateTime.Now, Title="小蓝日常"}, new Models.Blog{ Author="小白", Content="小白:我去看看!", Time=DateTime.Now, Title="小白日常"}, new Models.Blog{ Author="小黄", Content="小黄:我也去看看!", Time=DateTime.Now, Title="小黄日常"} }; blogs.ForEach(s => context.Blogs.Add(s)); context.SaveChanges(); var cou = new List<Models.Product> { new Models.Product{ Name="西瓜", Price=decimal.Parse("3.5")}, new Models.Product{ Name="油桃", Price=decimal.Parse("8")}, }; cou.ForEach(c => context.Products.Add(c)); context.SaveChanges(); } }
在Global中注册这个初始化类:
protected void Application_Start() { ......... //添加建表 Database.SetInitializer<EFDbContext>(new BaseInitializer()); }
//添加自动化建表,一般情况第一次运行需要这么写
//当修改了Model,又不想删除重建的时候,把SetInitializer的参数设null。
//原因是:删除重建会把测试数据也清除了
//Database.SetInitializer<EFDbContext>(null);
Database.SetInitializer<EFDbContext>(new BaseInitializer());
误删表,如何恢复:http://www.cnblogs.com/bleychen/p/4350913.html
EF通用数据层封装类:https://www.cnblogs.com/qtqq/p/6942312.html