Code-First的方式虽然省去了大量的sql代码,但增加了迁移的操作。尝试如下:
1、首先要在“扩展管理器”里搜索并安装NuGet“库程序包管理器”,否则所有命令都不能识别,会报CommandNotFound之类的错误。如果是离线状态,就下载NuGet.Tools.vsix并安装。这样,工具->库程序包管理器->管理解决方案的NuGet程序包里能自动找到已安装的EF组件。
2、为DAL项目安装EF,联机时可以直接在nuget里选择默认项目,输入install-package EntityFramework;脱机时需要手工下载EF的package,解压后在nuget里选择本地的源目录:install-package EntityFramework -IgnoreDependencies -Source c:\software\packages,这个DAL项目就已经添加了EF相应的引用,并且在项目的packages.config文件里添加了EF的信息
3、然后要为这个项目启动迁移。输入Enable-Migrations,会在项目里新建一个Migrations文件夹包含Configuration.cs和InitialCreate的还原点(这是针对sqlServer的,MySql的话需要Add-Migration自己手工生成)。如果已经存在Migration文件夹,可以删掉再重新enable-migrations,也会自动新建DB和表。必须确保DB和Model是完全匹配的,启动的时候EF会根据实体图生成Hash值,再与DB里__MigrationHistory的数据做对比,如果不匹配,就会报错。
4、现在DB已经建好了,随便改一下模型,比如给User加个Sex属性,接下去怎么做迁移呢?2种方式:1)开启自动更新AutomaticMigrationsEnabled=true;2)当然对于生产环境肯定不能这么干,用户数据是最重要的,这里Add-Migration test1。sqlserver里都OK,mysql里会报:
No MigrationSqlGenerator found for provider "MySql.Data.MySqlClient". Use SetSqlGenerator method in the target migrations configuration class to register additional SQL generators. 说的很清楚,在Configuration()里加止对应的sql generator就行:
this.SetSqlGenerator("MySql.Data.MySqlClient", new MySql.Data.Entity.MySqlMigrationSqlGenerator());
再次运行add-migration test1,生成迁移的代码。
5、执行update-database,model的变化反映到了DB中,__MigrationHistory里也添加了一条记录。如果是对外发布的话,要生成对应的sql脚本:update-database -script -sourceMigration:$InitialDatabase -TargetMigration:test3 -StartUpProjectName DAL.EF
6、EF上线时经常会报The model backing the context has changed since the database was created. Consider using Code First Migrations to update the database.
出现这个问题,首先要确认DB连接字符串正确,然后可以把测试版DB和正式版DB分别导出为sql,再用UltraCompare对比一下,保证所有的列和属性都是一致的。只要模型匹配,并且__MigrationHistory里的数据匹配,应该就能避免这个问题。
作者:AlexanderYao
出处:http://alexanderyao.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。