当前位置: 移动技术网 > IT编程>开发语言>.net > asp.net vs2010中使用 ef code first 详解

asp.net vs2010中使用 ef code first 详解

2018年10月30日  | 移动技术网IT编程  | 我要评论

环卫工人先进事迹,保定招聘兼职,好声音 那英

在 ef 4.2 与 4.3 之间的变化: 

新的 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确认数据库状态的

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网