在 EF 4.2 与 4.3 之间的变化: 新的 Code First 迁移特性:
这是 EF 4.3 中主要的新特性,允许通过 Code First 创建的数据库可以与你的代码模型一起增量进化。
移除的 EdmMetadata 表:
如果你允许简单地运行程序来通过 Code First 创建数据库(即没有显式启用迁移),那么,就会获得作为迁移一部分特性的,数据库架构生成的好处。
修复了 GetDatabaseValues:
在早期版本中,如果你的 entity 和 context 没有定义在同一个命名空间中,这个方法调用就会失败,这个问题已经被修复,使用 GetDatabaseValues 不再需要定义在同一个命名空间下。
修复了对 DbSet 名字中 Unicode 字符的支持:
在早期版本中,当在一个名字中包含有 Unicode 字符的 DbSet 中进行查询的时候,会导致异常,这个问题已经被修复了。
在非公共属性上的数据标注问题:
默认情况下,asp.net Code First 不会包含私有的,保护的,或者 internal 的属性,即使在你的模型中手工包含的情况下。在早期的版本中使用 Fluent API 将会忽略这类成员上的任何数据标注。这个问题已经被修复,现在 Code First 将会处理在模型中手工定义的私有、保护、内部的成员了。
更多的配置设置:
安装 EF4.3
工具 -> 程序包管理器 -> 程序包管理器控件台(需要 NuGet 更新到最新)
键入安装 EF 的命令 Install-Package EntityFramework(升级 EF 的命令 'Update-Package EntityFramework')
由实体生成 / 更新数据库表
1. 编写实体类
namespace TestDb
{
public class TestDbContext : DbContext
{
//public TestDbContext(): base("TestDbContext"){}//TestDbContext 是配置里的数据库连接名称,默认为 DbContext 的名字:TestDbContext
public DbSet<Book> Books {get; set;}
}
public class Book
{
public int BookId {get; set;}
[MaxLength(200)]
public string Title {get; set;}
public double Price {get; set;}
[MaxLength(60)]
public String Note5 {get; set;}
[NotMapped]
public String NotMappedTest{get; set;}
}
}
2. 在程序包管理器控件台启用迁移 Enable-Migrations(如果已经存在需要加上 -Force),常用部分参数如下(get-help Enable-Migrations -detailed 获取帮助):
-ProjectName:"" 指定项目
-Force 如存在则覆盖迁移配置(已经运行过 Enable-Migrations 生成了配置)
3. 新建迁移点 Add-Migration Book-ISBN(Book-ISBN 是任意一个名称标记,迁移点名称),常用部分参数如下(get-help Add-Migration -detailed 获取帮助):
-ProjectName:"" 指定项目
-Force 如存在则覆盖 可以参考 http://www.52mvc.com
4. 更新到数据库 Update-Database 或者 Update-Database –Verbose (Verbose 显示详细信息),常用部分参数如下(get-help update-database -detailed 获取帮助):
-ProjectName:"" 指定项目
-Script 生成迁移 sql 语句,如 Update-Database -Script 生成更新的迁移 sql, 不执行挂起的操作
-SourceMigration:" 开始迁移点 " 只能与 -Script 一起使用,如 Update-Database -Script -SourceMigration:$InitialDatabase 表示生成全部的迁移 sql
-TargetMigration:" 结束迁移点 " 回溯到某个迁移点,“0” 表示回到空数据库
-ConnectionStringName:" 配置里的数据库连接名称 " 指定数据库,这样不用修改代码 就可实现更新到新的数据库
生成的迁移文件
当运行 Add-Migration Book-ISBN 命令后生成的迁移程序如下:
namespace EdmDb.Migrations
{
using System.Data.Entity.Migrations;
public partial class reName3 : DbMigration
{
public override void Up()
{
AddColumn("Books", "Note3", c => c.String(maxLength: 60));
AlterColumn("Books", "Title", c => c.String(maxLength: 200));
DropColumn("Books", "Note2");
Sql(this.Des("Books", "Title", " 你好 "));// 手动添加,增加数据库注释
}
public override void Down()
{
AddColumn("Books", "Note2", c => c.String(maxLength: 60));
AlterColumn("Books", "Title", c => c.String());
DropColumn("Books", "Note3");
}
}
}
Des 方法,添加数据库注释,这样做还要手动添加注释的语句,如果可以修改 Add-Migration 的处理方式就好了,知道的请留言
public static class DbMigrationExt
{
public static string Des(this DbMigration mig,string tableName,string colName,string DesStr)
{
string sqlStr = "EXEC sys.sp_addextendedproperty @name=N'MS_Description'"
+ ", @value=N'" + DesStr + "' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE'"
+ ",@level1name=N'" + tableName + "', @level2type=N'COLUMN',@level2name=N'" + colName + "'";
return sqlStr;
}
}
注意删除数据库所有表要重建的时候,需要删除系统表__MigrationHis,__MigrationHis 表记录了迁移的日志,Add-Migration 是检查__MigrationHis 确认数据库状态的