asp.net vs2010中使用 ef code first 详解
新的 code first 迁移特性:
这是 ef 4.3 中主要的新特性,允许通过 code first 创建的可以与你的代码模型一起增量进化。
移除的 edmmetadata 表:
如果你允许简单地运行程序来通过 code first 创建数据库(即没有显式启用迁移),那么,就会获得作为迁移一部分特性的,数据库架构生成的好处。
修复了 getdatabasevalues:
在早期版本中,如果你的 entity 和 context 没有定义在同一个命名空间中,这个方法调用就会失败,这个问题已经被修复,使用 getdatabasevalues 不再需要定义在同一个命名空间下。
修复了对 dbset 名字中 unicode 字符的支持:
在早期版本中,当在一个名字中包含有 unicode 字符的 dbset 中进行查询的时候,会导致异常,这个问题已经被修复了。
在非公共属性上的数据标注问题:
默认情况下,.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 如存在则覆盖 可以参考 https://www.52m.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确认数据库状态的