HTML5技术

EF6(CodeFirst)+MySql开发脱坑指南 - kexxxfeng(2)

字号+ 作者:H5之家 来源:博客园 2016-01-03 13:37 我要评论( )

InitModel : DbMigration{ 本次迁移执行的具体操作,即升级数据库。 Up(){ // 创建架构为"dbo",表名为MyEntities"的数据库表。 CreateTable( ,c = new {Id = c.Int(nullable: false , identity: true ), // Id,int

InitModel : DbMigration { 本次迁移执行的具体操作,即升级数据库。 Up() { //创建架构为"dbo",表名为”MyEntities"的数据库表。 CreateTable( , c => new { Id = c.Int(nullable: false, identity: true),//Id,int类型,不可为空,标识列(自动增长)。 Name = c.String(),//Name,string类型 }) .PrimaryKey(t => t.Id);//设置主键为Id } 以后如果回滚数据库,那么会执行此降级方法。 Down() { DropTable();//删除架构为"dbo",表名为”MyEntities"的数据库表。 } }

第三步:在控制台输入Update-DataBase –script。生成Sql脚本。(在迁移过程中出现奇葩问题的时候,就生成sql脚本检查一下吧。)

. ( , (max), () ) . ( (150) NOT NULL, (300) NOT NULL, (max) NOT NULL, (32) NOT NULL, (, ) ) .(, , , ) , N, )

如上图所示:第一段创建表MyEntities,是我们的目标,这没错,很正常。

第二段:创建表_MigrationHistory,这是什么鬼。其实这就是EF6框架用来维护模型的表,

[MigrationId]:遍号,主键,存储设计类中Id,其实就是本次迁移记录的名称。

[ContextKey]:标记当前上下文的识别码,主键,因为CodeFirst支持多个上下文实例,所以用这个字段来标记。

[Model]:模型,当前模型的具体描述,加密了。

[ProductVersion]:EF框架的版本号。

EF6框架通过这张表具体记录每次迁移变化,也是通过这张表来检查程序中的对象和数据库中的关系是否一致。

下面继续在控制台输入:Update-DataBase –verbose(或者-v)。更新数据库,并且查看执行的具体sql语句。

结果:

image_thumb25

哦,通过查看错误信息,我们可以知道原来是当前配置的是MSSqlServer,而我本机又没有安装MSSqlServer数据库实例,所以当然连接不上了。我们的目标是MySql数据库,所以就要修改App.config中连接字符串了。

打开App.config:

找到连接字符串:

修改为MySql的连接字符串:

再次在控制台输入:Update-DataBase –verbose。

这是因为当前的Sql生成器依然是MSSqlServer,那么如何启动MySql的Sql生成器呢?

在Migration文件夹中的配置类Congifuration的构造方法中:

public Configuration() { AutomaticMigrationsEnabled = false; SetSqlGenerator(, new MySql.Data.Entity.MySqlMigrationSqlGenerator());//设置Sql生成器为Mysql的 }

再次在控制台输入:Update-DataBase –verbose。

我擦泪!!!

这是MyEntity.Name属性为string类型,直接映射到MySql中的话是longtext,而MySql支持最大长度为767bytes。

可以用DataAnnotations(数据注释)方式,配置MyEntity.Name属性的映射规则:(还有一种方式是FluntApi,之后再介绍)

public class MyEntity { public int Id { get; set; } [MaxLength(100)] public string Name { get; set; } }

但是到仅仅这样还不够,因为上下文配置还是默认的MSSqlServer的,_MigrationHistory表也有字段是string类型的,还会出现该错误。我们还要在MyContext类上通过特性标记上下文使用MySql的配置。

[DbConfigurationType(typeof(MySqlEFConfiguration))] public class MyContext : DbContext { …… }

因为修改了模型,所以要重新生成迁移,在控制台输入:Add-Migration InitModel –Force (表示强制执行,即更新。或者简写-f),然后再输入Update-Database –v。

PM> add-migration InitModel -f Re-scaffolding migration . PM> update-database -v Using StartUp project . Using NuGet project . Specify the flag to view the SQL statements being applied to the target database. Target database is: (DataSource: 127.0.0.1, Provider: MySql.Data.MySqlClient, Origin: Configuration). Applying explicit migrations: [201601021247042_InitModel]. Applying explicit migration: 201601021247042_InitModel. create table `MyEntities` (`Id` int not null auto_increment ,`Name` nvarchar(100) ,primary key ( `Id`) ) engine=InnoDb auto_increment=0 create table `__MigrationHistory` (`MigrationId` nvarchar(150) not null ,`ContextKey` nvarchar(300) not null ,`Model` longblob not null ,`ProductVersion` nvarchar(32) not null ,primary key ( `MigrationId`) ) engine=InnoDb auto_increment=0 INSERT INTO `__MigrationHistory`( `MigrationId`, `ContextKey`, `Model`, `ProductVersion`) VALUES ( , , 0x1F8B0800000000000400CD57DB6EDB38107D2FD07F20F89C9A4E822EBA81DC22759222D83A09AAB4EFB4347688F2A29254607F5B1FFA49FD851D5A77C9769DECA2280C181639333C73386746FEF9FD47F46EA5247904EB84D1137A3C1A53023A31A9D0CB09CDFDE2D51BFAEEEDCB17D165AA56E44B65771AECD053BB097DF03E3B63CC250FA0B81B299158E3CCC28F12A3184F0D3B198FFF66C7C70C3004C55884449F72ED8582CD033E4E8D4E20F3399733938274E53AEEC49BA8E4862B70194F6042A7687125ACF317A00C25E752700411835C50C2B5369E7B8478F6D941ECADD1CB38C3052EEFD719A0DD824B0725F4B3C6FCD02CC627210BD63856A192DC79A39E18F0F8B4A485F5DD9F452EAD6943E22E9160BF0E596FC89BD0D9BA58A2A47FD8D954DA60D8E37654791C91CEFA515D06582DE183FBB9F4B9858986DC5B2E8FC85D3E9722F907D6F7E62BE889CEA56CA3437CB8D759C0A53B6B32B07EFD091625E6EB9412D6F5637DC7DAADE5536473ADFDE909253778389F4BA82FBF9579EC8D850FA0C1720FE91DF71EAC0E31A0E48AED3D2B7C57A761B5A1662899F1D547D04BFF806A1AA34AAEC40AD26AA544F0590B94183A799B43F79088353737BC4F148AE702E1D6971A5660E5B7DC2A2AA0BC58571ED4CDA5881883EF168800474983A190D6A8A99E6D606B588D7059A1DC4AE16C87C4A319CF32E4AD25F97285C4A5DE5FC54F57832A62B0C46D11458DB63E09AB802FA1B7DB9603F77CCEC3CD4D5335306B2E6107C1D539039EFB0A6868AF5CC2EFC26DBB36FB211AFEAE30258565BCC90E6A2CAD463070DDF45B2EB9DD22A9A991B9D2BB64B9CFBB1049DBBF58194688580F7B9F1F3620A8D71CFA94EFABD5BE497D7A5DB3BDDA8CCA3A79CA8C2A0BA730A104A97914695134F137390AFBA3CDCFA91498706331E35A2CC0F9A281D2D7A3BF7AB3EECF993BCCB9541E387C7EFB101081D45FB6F9C18C38BCEFEB476E93076E879DBF09FA5FDBFCB0111DD4CAD77B1B795193139ACEF135EABE00DA9E01CF6CF4439144ACFDBA175D8013CB264478F9D39084EA6B825636D77A612AEE31BD36A2CAA4773533F03C4596CEAD170B9E78DC4EC0B9CD68FEC2658E26976A0EE9B5BECD7D96FB73E740CD6567B0456CFFF99B69D6C51CDD66E1C9FD1F29204C8129C0AD7E9F0B99D6B8AF86A5B92B442898B2DE1115BE9A60B8E5BA8E7463F481814AFA2E20031DD4720F2A9318CCDDEA983FC273B0E17BC94758F2645DB5BADD417E7D115DDAA30BC197962B57C668FCC35F1816FEC3BCFD175F3BFF74F50C0000, ); Running Seed method.

最后执行了Seed方法,我们去检查下MySql数据库,看到如下图所示

image_thumb[1]

最终执行了Seed方法,初始化了这么一条数据。

 

如此,使用CodeFirst+MySql的基本姿势已经结束了。

以后更新模型的话,只要走第二步和第三步就可以了。

 

细数MySql中特别迷人(keng)之处

……未完待续……  

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • 【Vue 入门】使用 Vue2 开发一个展示项目列表的应用 - zhangjk

    【Vue 入门】使用 Vue2 开发一个展示项目列表的应用 - zhangjk

    2017-04-30 16:00

  • 在Delphi下使用迅雷APlayer组件进行免注册开发 - Delphi力量

    在Delphi下使用迅雷APlayer组件进行免注册开发 - Delphi力量

    2017-04-28 15:00

  • 随应潮流-基于ABP+Angularjs现代化应用软件开发框架(1)-总体介绍 - 在路在的张

    随应潮流-基于ABP+Angularjs现代化应用软件开发框架(1)-总体介绍 -

    2017-04-22 08:04

  • vue2.0版cnode社区项目搭建及实战开发 - sandisen

    vue2.0版cnode社区项目搭建及实战开发 - sandisen

    2017-04-20 14:00

网友点评