初试Code First

练习Code First
tools:vs2015 sqlServer2012

新建项目

新建-项目-Visual C#-windows-控制台应用程序,命名为:CodeFirstDemo。

安装EntityFramework程序包

新建好CodeFirstDemo项目后,我们先来安装EntityFramework,项目-管理NuGet程序包-联机-搜索“EntityFramework”,下载安装。
安装完成后会在项目下自动添加EntityFramework引用:

在Program.cs下添加命名空间 using System.Data.Entity;

创建模型

为了简单我们直接在Program.cs中创建模型,以后可分离出去

    public class New
    {
        public int NewId { get; set; }
        public string Title { get; set; }
        public int NewTypeId { get; set; }
        public virtual NewType NewType { get; set; }
    }
    public class NewType
    {
        public int NewTypedId { get; set; }
        public string Name { get; set; }
        public int BlogId { get; set; }
        public virtual List<New> New { get; set; }
    }

NewId和NewTypeId在创建的时候会做为表的主键,因为包含有ID关键字,如果不包含的话,需要我们指定主键,要不然创建就会报未找到主键的错误,添加命名空间:
using System.ComponentModel.DataAnnotations;
并在属性前添加[Key]标注,指示此字段作为主键:

[Key]
public int NewId { get; set; }
[Key]
public int NewTypedId { get; set; }

当然除了Key,System.ComponentModel.DataAnnotations命名空间下还有其他的Attribute,这边就不多说,可以查看msdn有关教程:http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.aspx
需要注意的另外一点,上面定义模型属性的时候有virtual关键字,表示延迟加载,我的理解是这样:当我访问主实体的时候,启动延迟加载,而不会查询数据库的子实体,只有要访问它的时候才会去数据库查询加载,泛型List表示此实体是一对多的关系。
EF默认是启动延迟加载的,我们如果不需要也可以手动禁止:
db.Configuration.LazyLoadingEnabled = false;

创建上下文DbContext

DBContext,可以理解为是一个容器,里面有对象与数据表的映射关系以及对象本身.
我对EF中上下文的理解:可以把上下文看成一个数据库控制器,我们可以在其中查询、更改、删除数据,然后通过连接获取或是提交。就像是遥控车的遥控器一样,EF是这个遥控器的核心部件,天线是连接字符串,遥控车是数据库,这个比喻可能不是很恰当,但就是这个意思,大家都懂得。

    public class NewsContext : DbContext
    {
        public DbSet<New> News { get; set; }
        public DbSet<NewType> NewTypes { get; set; }
    }

DbSet表示上下文中给定类型的所有实体的集合或可从数据库中查询的给定类型的所有实体的集合,就像是一个包裹,需要什么东西就往里面装什么东西。

配置连接字符串

vs默认可以生成数据库,数据库名是项目命名空间+上下文,有时候我们需要自己定义生成数据库名称,或是生成数据库到指定的服务器,而且有时候数据库迁移了,我们不能再重新生成一遍吧,这时候我们就要自定义数据库连接字符串了:

  <connectionStrings>
    <add name="NewsContext" providerName="System.Data.SqlClient" connectionString="Data Source=(local);Initial Catalog=CodeFirstDemoDB;User ID=sa;Password=sa" />
  </connectionStrings>

需要注意的是:连接字符串的名称必须要和上下文一致,而且connectionStrings必须放在configuration节点内的最下面

创建数据库、读/写数据

在Program.cs的Main方法中填写代码:

            using(var db=new NewsContext())
          {
              Console.Write("输入新闻类型标题: ");
              var name = Console.ReadLine();
              var type_Model = new NewType { Name = name };
              db.NewTypes.Add(type_Model);
              db.SaveChanges();

              Console.WriteLine("查询新闻类型标题: ");
              var search_type = Console.ReadLine();
              var query = from b in db.NewTypes
                          where b.Name == search_type
                          select b;

              Console.WriteLine("查询结果: ");
              foreach (var item in query)
              {
                  Console.WriteLine(item.Name);
              }
              Console.ReadKey();
          }

上面代码创建一个上下文对象实例,通过该实例添加一个新闻实体,然后通过输入的值,linq查询结果输出。

通过上面的操作,我们并没有创建什么连接字符串和数据库操作,但是打开数据库就可以看到我们通过Code First创建的数据库了。

CodeFirst迁移

关于Code First 迁移其实就是我们在更改模型的时候,数据库要相应的更改。

  1. 例如我们上面创建NewTypes表的时候,没有指定字段的长度,默认是创建字段类型是nvarchar(MAX),有时候我们觉得字段长度太长,需要修改一下字段长度,不要直接去修改数据库,而是在模型中修改:
[MaxLength(50)]
public string Name { get; set; }

MaxLength就是上面我们说到DataAnnotations命名空间下的类型,这边我们注意下,我们在生成数据库的时候添加了一条数据,Name字段值是“2017年大吉”,看看我们修改字段长度后,字段值是否发生变化?

  1. 在程序包管理器控制台输入Enable-Migrations命令来启用迁移,运行完成后在项目中会创建一个Migrations文件夹,下来有两类文件:
  • Configuration.cs — 此文件包含“迁移”将用来迁移 BloggingContext 的设置。在本演练中不需要进行任何更改,但是,在此处可以指定种子数据、为其他数据库注册提供程序、更改生成迁移的命名空间等。
  • <时间戳>_InitialCreate.cs — 这是第一个迁移,它表示已经应用于数据库的更改。应用更改的目的是将其从空数据库迁移至包含博客和文章表的数据库。尽管我们让 Code First 自动创建这些表,现在我们选择“迁移”(已转化为一次“迁移”)。Code First 还在本地数据库中记录:该“迁移”已经应用。文件名中的时间戳用于排序。

需要注意的是:在我们生成数据库的时候,除了New和NewType表外,还有一个系统生成表__MigrationHistory,从表名上就可以看出是迁移历史记录表。

  1. 在程序包管理器控制台输入Add-Migration Update-NewType-Name命令,Add-Migration表示增加一个迁移,后面是迁移名称,这个我们可以随便写,运行后会自动检测模型和数据库发生的变化,在Migrations文件夹下会生成一个“201702030624087_Update-NewType-Name.cs”文件,打开我们可以看到更新内容
namespace codeFirstDemo.Migrations
{
    using System;
    using System.Data.Entity.Migrations;
    
    public partial class UpdateNewTypeName : DbMigration
    {
        public override void Up()
        {
          AlterColumn("dbo.NewTypes", "Name", c => c.String(maxLength: 50));
        }
        
        public override void Down()
        {
          AlterColumn("dbo.NewTypes", "Name", c => c.String());
        }
    }
}

从上面可以看出就是我们上面修改模型的内容,当然你也可以在这上面直接修改,比如你再加一个更新,可以一起提交到数据库。

  1. 在程序包管理器控制台输入“Update-Database”命令,表示将所有的迁移应用到数据库,打开数据库,我们看一下效果:

从上面可以看出,字段Name的类型已经修改为nvarchar(50),而且字段值并没有发生变化,可以证明,Code First迁移并不是删除数据库再创建。

Code First迁移除了上面说的字段类型修改还有很多内容,比如添加字段,删除字段,删除表等等,但都是大同小异,可以举一反三。

示例Demo下载

codeFirst

本文参照初试Code First(附Demo).

Link:简书
github:blog

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

推荐阅读更多精彩内容