CodeFirst的意思是根据EF实体类创建对应的数据结构,创建过程由DotNet框架自己完成,程序员可以部分干涉。
1.CodeFirst数据库策略
CreateDatabaseIfNotExists:默认的策略:如果数据库不存在,那么就创建数据库。但是如果数据库存在了,而且实体发生了变化,就会出现异常。
DropCreateDatabaseIfModelChanges:此策略表明:如果模型变化了,数据库就会被重新创建,原来的数据库被删除掉了。
DropCreateDatabaseAlways:此策略表示:每次运行程序都会重新创建数据库,这在开发和调试的时候非常有用。
2.使用EF读取数据时创建数据
步骤如下:
1)创建项目
2)添加EF实体类
3)添加DbContext派生类
首先要引入EntityFramework程序包,可以使用NuGet控制台命令:Install-Package EntityFramework -Version 5.0.0。
然后定义派生类,可以在构造函数或者app.config/web.config中定义数据库策略。
构造函数定义:
class="code_img_closed" src="/Upload/Images/2015031317/0015B68B3C38AA5B.gif" alt="" />logs_code_hide('5f12fa01-686e-487f-9d7e-8bab14e3c39a',event)" src="/Upload/Images/2015031317/2B1B950FA3DF188F.gif" alt="" /> 1 public class BloggingContext : DbContext
2 {
3 public BloggingContext()
4 : base("TestEFConnection")
5 {
6 //代码优先数据库策略
7 //默认的策略:如果数据库不存在,那么就创建数据库。但是如果数据库存在了,而且实体发生了变化,就会出现异常。
8 Database.SetInitializer(new CreateDatabaseIfNotExists<BloggingContext>());
9 }
10
11 public DbSet<Blog> Blogs { get; set; }
12 public DbSet<Post> Posts { get; set; }
13 }
View Code
Web.config定义:
添加到appSettings节点
<add key="DatabaseInitializerForType Ebuy.Website.Models.EbuyDataContext,Ebuy.Website" value="System.Data.Entity.CreateDatabaseIfNotExists`1[[TestEF.TestCodeFirst.BloggingContext,TestEF.TestCodeFirst]],EntityFramework" />
TestEF.TestCodeFirst.BloggingContext:表示完整的类名称,TestEF.TestCodeFirst:表示类所在程序集
注意:以上两种选择其一即可!
禁止数据库策略:
<add key="DatabaseInitializerForType TestEF.TestCodeFirst.BloggingContext, TestEF.TestCodeFirst" value="Disabled" />
此配置将禁止应用CodeFirst创建数据库!
4)读取数据(创建数据库)
运行程序使用EF上下文(DbContext派生类),读取或者写入数据到实体对象,提交数据后EF会根据数据库策略删除或创建数据库。
注意:最好明确指定数据库连接名称(DbContext派生类构造函数中指定),否则因各自安装数据库组件的不同,可能得到的并不是预期效果。
官方说法是:
如果本地 SQL Express 实例可用(默认情况下随 Visual Studio 2010 安装),则 Code First 对该实例创建数据库
如果 SQL Express 不可用,则 Code First 将尝试使用LocalDb(默认情况下随 Visual Studio 2012 安装)创建数据库
3.使用Migration相关命令主动迁移数据
CodeFirst模式默认使用CreateDatabaseIfNotExists策略,因此开发过程中常常遇到”数据结构已更改,需要更新数据”的错误提示,这时候就要使用Code First迁移。
迁移命令以下部分组成:
Enable-Migrations:启动CodeFirst数据迁移,第一次迁移会创建Migrations文件夹,包括:Configuration.cs,<时间戳>_InitialCreate.cs(当前数据库不存在时,不会创建此文件)。
Add-Migration:命令检查自上次迁移后是否有更改,并使用所有更改搭建新迁移,可以为迁移指定名称。
Update-Database:此命令将所有挂起的迁移应用于数据库
1)已有当前数据库
使用上面介绍的步骤创建数据库后,CodeFirst会在当前数据库__MigrationHistory表中添加迁移记录,如:
使用Enable-Migrations命令初始化CodeFirst时,将在项目文件夹Migrations中创建MigrationId对应的文件。
如果实体模型改变了,那么使用Add-Migration [迁移文件名] 命令可以生成待迁移文件,最后使用Update-Database命令提交改变。
2)没有当前数据库
》执行Entity-Migrations,创建Migrations文件夹(只包括Configuration.cs)
》执行Add-Migration [迁移文件名]
》执行Update-Database创建数据库
》查询数据库:select * from __MigrationHistory,会发现迁移记录,MigrationId就是项目中对应的迁移文件名。
引用:https://msdn.microsoft.com/zh-cn/data/jj193542