1、ef code first创建数据库 新建控制台应用程序portal,通过程序包管理器控制台添加entityframework。 在程序包管理器控制台中执行以下语句,安装entityframework。 pm install-package entityframework 安装成功后,界面提示如下图: 在新建的portal控制台
1、ef code first创建数据库
新建控制台应用程序portal,通过程序包管理器控制台添加entityframework。
在程序包管理器控制台中执行以下语句,安装entityframework。
pm> install-package entityframework
安装成功后,界面提示如下图:
在新建的portal控制台应用程序中添加两个实体类,代码结构如下:
其中,类文件portalcontext.cs的代码如下:
using system;using system.collections.generic;using system.linq;using system.text;using system.data.entity;using system.data.entity.infrastructure;using portal.entities;using portal.mapping;namespace portal{ public class portalcontext : dbcontext { static portalcontext() { database.setinitializer(new dropcreatedatabaseifmodelchanges()); } public dbset provinces { get; set; } public dbset categories { get; set; } protected override void onmodelcreating(dbmodelbuilder modelbuilder) { modelbuilder.configurations.add(new provincemap()); modelbuilder.configurations.add(new categorymap()); } }}
在静态构造函数中,设置了当数据库模型发生改变时,则删除当前数据库,重建新的数据库。
代码执行后,生成的数据库:
2、ef code first数据库迁移
2.1、生成数据库
修改类文件portalcontext.cs的静态构造函数,取消当数据库模型发生改变时删除当前数据库重建新数据库的设置。
static portalcontext(){ database.setinitializer(null);}
1>、在程序包管理器控制台,执行语句:
pm> enable-migrations -enableautomaticmigrations
执行成功后,portal控制台应用程序代码结构中,添加migrations文件夹,并生成类文件configuration.cs。
namespace portal.migrations{ using system; using system.data.entity; using system.data.entity.migrations; using system.linq; internal sealed class configuration : dbmigrationsconfiguration { public configuration() { automaticmigrationsenabled = true; } protected override void seed(portal.portalcontext context) { // this method will be called after migrating to the latest version. // you can use the dbset.addorupdate() helper extension method // to avoid creating duplicate seed data. e.g. // // context.people.addorupdate( // p => p.fullname, // new person { fullname = andrew peters }, // new person { fullname = brice lambson }, // new person { fullname = rowan miller } // ); // } }}
2>、在程序包管理器控制台,执行语句:
pm> add-migration initialcreate
执行成功后,在migrations文件夹中新增类文件201309201556388_initialcreate.cs
3>、在程序包管理器控制台,执行语句:
pm> update-database -verbose
执行结果生成与上面一致的数据库
4>、在数据库模型中添加city类,执行程序包管理器控制台语句,migrations文件夹中新增类文件201309201643300_addcity.cs。
pm> add-migration addcity
再次执行程序包管理器控制台语句
pm> update-database -verbose
portal控制台应用程序的代码结构:
数据库更新成功之后,在数据库中新增表city。
2.2、版本回溯
修改数据库中表city,删除其中字段provinceno。在程序包管理器控制台中执行以下两条语句:
pm> add-migration modifycity
pm> update-database -verbose
执行成功之后,city表结构修改为:
执行程序包管理器控制台语句,进行数据库版本回溯。
pm> update-database –targetmigration:201309201643300_addcity.cs
2.3、生成数据库版本之间的sql脚本
执行程序包管理器控制台语句,生成数据库版本之间的sql脚本。该操作仅为生成sql语句,并未在数据库中进行执行。
update-database -script -sourcemigration:201309201643300_addcity.cs -targetmigration:201309201708043_modifycity.cs
其中-targetmigration在未指定的情况,默认为迁移到最新的版本。
3、ef code first migrations语句的其他参数
1>、为指定的dbcontext启用数据库迁移
pm> enable-migrations -contexttypename portal.portalcontext
2>、设置是否允许自动迁移
enable-migrations
生成的configuration.cs类文件的构造函数
public configuration(){ automaticmigrationsenabled = false;}
3>、enable-migrations指定项目名称
pm> enable-migrations -startupprojectname portal
如果在“package manager console”中选择了默认项目可以不设置“-startupprojectname”参数;如果多次执行此命令可以添加-force参数。
4>、查看所执行的sql语句 -verbose指令
update-database -verbose
4、代码下载
portal.zip
5、参考资料
http://msdn.microsoft.com/en-us/data/jj591621