浅谈 EF + Code First

先谈谈使用DB First踩的一些坑
版本冲突问题:

由于我们公司做的是HIS软件,HIS的功能很多业务很复杂,也就少不了会建很多张表、视图、存储过程什么的。我进公司前大家都自己更新模型,经常会遇到更新代码后编译报错。主要原因是模型更新后里面变动的东西太多了,大家又对这些变动的东西不熟悉,在遇到版本冲突的时候就按提示解决版本冲突,结果就导致了编译报错。最后统一由一个人负责更新模型。

更新模型时间长:

在更新时程序会检查每张表、每个字段、每个主键、每个索引逐一检查,更新一次模型基本上就是半个小时左右(简直蓝瘦)。
感觉DB First只适合那种表不多的中小型项目。

数据库升级脚本混乱

经常在生产库升级的时候遇到程序各种报错,各种数据库字类型和代码字段类型不一致、写的SQL脚本报错。

进入正题

废话不多说进入正题!先来一组命令
Enable-Migrations:启用迁移
Add-Migrations:为下次建议搭建基架(可以理解为将你写的模型生成SQL脚本,还有历史记录哦!强大不)
Update-Datebase:将代码变更同步数据库(可以理解为在数据库中执行上面生成的SQL)
Update-Datebase -Script -SourceMigrations $InitialDatabase:生成SQL脚本,能够从任意数据库版本升级。【这个很重要,特别是对生产环境中需要升级数据库】
什么?不知道这个命令怎么用?在哪用?那你一定用的不是VS Code,用VS的就在【工具】=》【Nuget包管理器】=》【程序包管理控制台】,别急着用哦!等我上代码先~

程序代码
    /// <summary>
    /// 定义模型
    /// </summary>
    public class Blog : BaseBlog
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Url { get; set; }
        [NotMapped]
        public int Phone { get; set; }//存在NotMapped,字段将不会再数据库中创建
        public char Char { get; set; }//char是数据关键字,在数据库中不会被创建
        public DateTime? CreateTime { get; set; }
        //public string NewColumn { get; set; }
    }

    /// <summary>
    /// 定义模型规则
    /// </summary>
    public class BlogMap:EntityTypeConfiguration<Blog>
    {
        public BlogMap()
        {
            ToTable("Blogs");
            HasKey(k => k.Id);
            //Property(p => p.NewColumn).HasMaxLength(50);
        }
    }

    public class EfDbContext : DbContext
    {
        public EfDbContext() : base("ConnectionString")
        {
            Database.SetInitializer(new DropCreateDatabaseAlways<EfDbContext>());
        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            //这坨代码很有用!!!定义模型规则代码可以分门别类维护,让上下文显得更简洁
            var typesToRegister = Assembly.GetExecutingAssembly().GetTypes().Where(type =>
                type.BaseType != null && type.BaseType.IsGenericType &&
                type.BaseType.GetGenericTypeDefinition() == typeof(EntityTypeConfiguration<>));
            foreach (var type in typesToRegister)
            {
                dynamic configurationInstance = Activator.CreateInstance(type);
                modelBuilder.Configurations.Add(configurationInstance);
            }
            base.OnModelCreating(modelBuilder);
        }

        public IDbSet<Blog> Blogs { get; set; }
        
    }
配置文件代码
  <connectionStrings>
    <add name="ConnectionString" connectionString="Data Source=.;Initial Catalog=EfDb;User ID=sa;Integrated Security=true" providerName="System.Data.SqlClient"/>
  </connectionStrings>

随便建个控制台程序,把上面代码贴进去就可以。

好戏开场,见证奇迹的时刻到了!
一、将模型同步到数据库

执行以下命令:
1、Enable-Migrations,看工程目录是不是已经生成了一些东西了。


image.png

2、Add-Migrations CreaateBg【按日期规则和定义的名称生成文件名】


image.png

3、Update-Datebase
到数据库看看是不是表结构已经创建好了

二、模型添加字段后同步到数据库

取消下面这行代码注释

public string NewColumn { get; set; }

1、Add-Migrations AddNewColumn【执行后再次生成一个变更文件】
2、Update-Datebase
现在数据库中已经加上了“NewColumn”这个字段了

三、修改数据库字段长度

取消下面这行代码注释

Property(p => p.NewColumn).HasMaxLength(50);

1、Add-Migrations EditColumnLength【执行后再次生成一个变更文件】


image.png

2、Update-Datebase

生成环境如何升级呢?

执行以下命令将生成的SQL能够让生产环境中的任何版本的数据库升级到最新版本
Update-Datebase -Script -SourceMigrations $InitialDatabase

总结

是不是感觉Code First很爽呢?只要你够熟练开发过程中都不用打开数据库,数据库的升级脚本也由开发环境自动生成好了。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容