欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-02-28 15:28:00
在 ef 4.2 与 4.3 之间的变化:  新的 code first 迁移特性:     这是 ef 4.3 中主要的新特性,允许通过 code first 创建的...
在 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确认数据库状态的