很显然这是默认的MSSqlServer的配置,稍后再来修改。
3、在MyContext中,反注释掉MyEntities极其实现类代码。
public virtual DbSet<MyEntity> MyEntities { get; set; }
public class MyEntity { public int Id { get; set; } public string Name { get; set; } }
这就是程序中的对象。
根据CodeFirst的约定:Id会被设置为主键。
更多约定详见msdn(https://msdn.microsoft.com/zh-cn/data/jj679962)。
4、如何把MyEntities映射到MySql数据库中?。 三步走:
打开vs工具
第一步: 在控制台中输入Enable-Migrations(启动迁移)。注意:默认项目一定要是模型所在的项目。
此时项目中会自动生成Migration文件夹
下面我来解释下Configuration.cs类
这是迁移的配置类,在最后执行迁移的时候会执行这个类。
它有两个方法:
a、Congifuration():无参的构造方法。可以在这里配置迁移之前的操作,后文再详细描述。
b、Send(MyContext):void:这个方法是在执行迁移成功之后执行,一般用来初始化数据库用的。例如:我要在生成数据库的时候就初始化一个MyEntities记录。
protected override void Seed(CodeFirstDemo.MyContext context) { // This method will be called after migrating to the latest version. // You can use the DbSet<T>.AddOrUpdate() helper extension method // to avoid creating duplicate seed data. E.g. // // context.People.AddOrUpdate( // p => p.FullName, // new Person { FullName = "Andrew Peters" }, // new Person { FullName = "Brice Lambson" }, // new Person { FullName = "Rowan Miller" } // ); // context.MyEntities.AddOrUpdate(new MyEntity() { Name = "张三" }); context.SaveChanges(); }
第二步:在控制台输入:Add-Migration InitModel。(InitModel:为本次迁移起个名字)
此时在项目的Migration文件夹中会自动生成迁移记录文件,文件名以当前时间_本次迁移的名字作为类名。
记录文件有一个设计类和一个资源类和一个迁移具体操作的方法。
设计类:本次迁移的具体记录。自动生成、维护。
资源类:默认架构和目标。自动生成、维护。
具体操作:该类维护Up()和Down()两个方法,分别用于升级和降级。有时候需要我们自己定制,因此要理解它,可以参考我写的注释。
public partial class InitModel : DbMigration { /// <summary> /// 本次迁移执行的具体操作,即升级数据库。 /// </summary> public override void Up() { //创建架构为"dbo",表名为”MyEntities"的数据库表。 CreateTable( "dbo.MyEntities", c => new { Id = c.Int(nullable: false, identity: true),//Id,int类型,不可为空,标识列(自动增长)。 Name = c.String(),//Name,string类型 }) .PrimaryKey(t => t.Id);//设置主键为Id } /// <summary> /// 以后如果回滚数据库,那么会执行此降级方法。 /// </summary> public override void Down() { DropTable("dbo.MyEntities");//删除架构为"dbo",表名为”MyEntities"的数据库表。 } }
第三步:在控制台输入Update-DataBase –script。生成Sql脚本。(在迁移过程中经常奇葩问题的时候,就生成sql脚本检查一下吧。)
CREATE TABLE [dbo].[MyEntities] ( [Id] [int] NOT NULL IDENTITY, [Name] [nvarchar](max), CONSTRAINT [PK_dbo.MyEntities] PRIMARY KEY ([Id]))CREATE TABLE [dbo].[__MigrationHistory] ( [MigrationId] [nvarchar](150) NOT NULL, [ContextKey] [nvarchar](300) NOT NULL, [Model] [varbinary](max) NOT NULL, [ProductVersion] [nvarchar](32) NOT NULL, CONSTRAINT [PK_dbo.__MigrationHistory] PRIMARY KEY ([MigrationId], [ContextKey]))INSERT [dbo].[__MigrationHistory]([MigrationId], [ContextKey], [Model], [ProductVersion])VALUES (N‘201601021118458_InitModel‘, N‘CodeFirstDemo.Migrations.Configuration‘, 0x1F8B0800000000000400CD57DB6E1B37107D0FD07F20F8D400B6E8CB4B6AAC12B8B25D18896C23EBE49DDA1DC94479D9925C43FB6D79C827F5173AD4DE7725457683A2102068676786670EE70CA9BFBF7D8F3EAC9524CF609D307A4A4F272794804E4C2AF46A4A73BF3C7E473FBCFFE54D749DAA35F95AFB9D073F8CD46E4A9FBCCF2E1873C91328EE264A24D638B3F493C428C653C3CE4E4E7E63A7A70C3005C55C84449F73ED8582CD033ECE8C4E20F3399773938274951DDFC49BACE48E2B70194F604A67E87123ACF357A00C259752700411835C52C2B5369E7B8478F1C541ECADD1AB384303978F4506E8B7E4D24105FDA2753FB48A93B350056B03EB5449EEBC512F4C787A5ED1C286E1AF229736B42171D748B02F42D51BF2A6745E94264A868B5DCCA40D8E036E2775C411E9D98F9A36C06E091F7C9F4B9F5B986AC8BDE5F2883CE40B29928F503C9A3F414F752E65171DE2C3773D039A1EACC9C0FAE2332C2BCCB72925AC1FC786814D5827A6ACE656FBF3334AEE7071BE90D06C7EA7F2D81B0B7F8006CB3DA40FDC7BB03AE4808A2BB677ADF05DAF86DD869AA164CED79F40AFFC1352CED794DC8835A4B5A542F0450B941806799B437F9188B53B37DE4F148AE702E1369B1A2CB0F65B761515506DACAB16EAD752668CC1F71B4480A3A4C5504A6BD276CF36B00DAC56B8AC546EAD70B643E2D19C6719F2D6917C652171A5F7E3F8E56A50650E96B82DA268D0362B6117F0150CDE76E5C03D5FF0B073B3548DDCDA4DD84170BDCE88E7A1025ADAEB90F0BB0CDBAECD618A96BF1B2C49611B6FAA83064B67108C4237F3964B6EB7486A6664AEF42E59EE8B2E45D28D2F2DE30C111B601FF2C346040D86C390F27DBD3A7469566F7A76D09B51D5272F39A3AAC6295D28416A9E451A9A262E9C0735090E93F82F399302EB6D1DE65C8B25385FCE4F8A7DFD6E70D6FD7FCE1DE65C2A0F3C7CFEF3434004567F38E64767C4E1735F3F739B3C71FBABE2EBB7DD4CFF76B68FA7CF41F3BBD83BBDCB469CD2748177A7C7126877F0BF72BA8F9511B1EE1D2FBA0227566D8A70E3D39084966B93D63EB77A696AC2B1BC2EA2DA65B01F73F03C45962EAD174B9E787C9D80739BF3F82B9739BA5CAB05A4B7FA3EF759EE2F9D03B590BDD32C62FBD7DF1C617DCCD17D169EDCCF2801610A2C01EEF5EFB9906983FB66DC8FBB528486A99A1C51E17D04D3AD8A26D39DD10726AAE8BB820C7490C823A84C623277AF63FE0CAFC18697914FB0E249510FB8DD497EBC117DDAA32BC157962B57E568E3C3FF1616FEB8BCFF07A10C3040EA0C0000 , N‘6.1.3-40302‘)
如上图所示:第一段创建表MyEntities,是我们的目标,这没错,很正常。
第二段:创建表_MigrationHistory,这是什么鬼。其实这就是EF6框架用来维护模型的表,
[MigrationId]:遍号,主键,存储设计类中Id,其实就是本次迁移记录的名称。
[ContextKey]:标记当前上下文的识别码,主键,因为CodeFirst支持多个上下文实例,所以用这个字段来标记。
[Model]:模型,当前模型的具体描述,加密了。
[ProductVersion]:EF框架的版本号。
EF6框架通过这张表具体记录每次迁移变化,也是通过这张表来检查程序中的对象和数据库中的关系是否一致。
下面继续在控制台输入:Update-DataBase –verbose(或者-v)。更新数据库,并且查看执行的具体sql语句。
结果:
哦,通过查看错误信息,我们可以知道原来是当前配置的是MSSqlServer,而我本机又没有安装MSSqlServer数据库实例,所以当然连接不上了。我们的目标是MySql数据库,所以就要修改App.config中连接字符串了。
打开App.config:
找到连接字符串:
<connectionStrings> <add name="MyContext" connectionString="data source=(LocalDb)MSSQLLocalDB;initial catalog=CodeFirstDemo.MyContext;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" /> </connectionStrings>
修改为MySql的连接字符串:
<connectionStrings> <add name="MyContext" connectionString="Data Source=127.0.0.1;port=3306;Initial Catalog=CodeFirstDemoDb;user id=root;password=1234;" providerName="MySql.Data.MySqlClient"/> </connectionStrings>
再次在控制台输入:Update-DataBase –verbose。
这是因为当前的Sql生成器依然是MSSqlServer,那么如何启动MySql的Sql生成器呢?
在Migration文件夹中的配置类Congifuration的构造方法中:
public Configuration() { AutomaticMigrationsEnabled = false; SetSqlGenerator("MySql.Data.MySqlClient", new MySql.Data.Entity.MySqlMigrationSqlGenerator());//设置Sql生成器为Mysql的 }
再次在控制台输入:Update-DataBase –verbose。
我擦泪!!!
这是MyEntity.Name属性为string类型,直接映射到MySql中的话是longtext,而MySql支持最大长度为767bytes。
可以用的是DataAnnotations(数据注释)方式,配置MyEntity.Name属性的映射规则:
public class MyEntity { public int Id { get; set; } [MaxLength(100)] public string Name { get; set; } }
未完待续……
细数MySql中特别迷人(keng)之处
EF6(CodeFirst)+Mysql开发脱坑指南
标签:
小编还为您整理了以下内容,可能对您也有帮助:
EF core使用code first无法为mysql数据表设置字段默认值,该怎么办...
connectionStrings> <add name="MyContext" connectionString="data source=(LocalDb)MSSQLLocalDB;initial catalog=CodeFirstDemo.MyContext;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" /></connectionStrings>
很显然这是默认的MSSqlServer的配置,稍后再来修改。
3、在MyContext中,反注释掉MyEntities极其实现类代码。
public virtual DbSet<MyEntity> MyEntities { get; set; }
public class MyEntity { public int Id { get; set; } public string Name { get; set; } }
这就是程序中的对象。
根据CodeFirst的约定:Id会被设置为主键。
更多约定详见msdn(https://msdn.microsoft.com/zh-cn/data/jj679962)。
4、如何把MyEntities映射到MySql数据库中?。 三步走:
打开vs工具
第一步: 在控制台中输入Enable-Migrations(启动迁移)。注意:默认项目一定要是模型所在的项目。
此时项目中会自动生成Migration文件夹
下面我来解释下Configuration.cs类
这是迁移的配置类,在最后执行迁移的时候会执行这个类。
它有两个方法:
a、Congifuration():无参的构造方法。可以在这里配置迁移之前的操作,后文再详细描述。
b、Send(MyContext):void:这个方法是在执行迁移成功之后执行,一般用来初始化数据库用的。例如:我要在生成数据库的时候就初始化一个MyEntities记录。
protected override void Seed(CodeFirstDemo.MyContext context) { // This method will be called after migrating to the latest version. // You can use the DbSet<T>.AddOrUpdate() helper extension method // to avoid creating duplicate seed data. E.g. // // context.People.AddOrUpdate( // p => p.FullName, // new Person { FullName = "Andrew Peters" }, // new Person { FullName = "Brice Lambson" }, // new Person { FullName = "Rowan Miller" } // ); // context.MyEntities.AddOrUpdate(new MyEntity() { Name = "张三" }); context.SaveChanges(); }
第二步:在控制台输入:Add-Migration InitModel。(InitModel:为本次迁移起个名字)
此时在项目的Migration文件夹中会自动生成迁移记录文件,文件名以当前时间_本次迁移的名字作为类名。
记录文件有一个设计类和一个资源类和一个迁移具体操作的方法。
设计类:本次迁移的具体记录。自动生成、维护。
资源类:默认架构和目标。自动生成、维护。
具体操作:该类维护Up()和Down()两个方法,分别用于升级和降级。有时候需要我们自己定制,因此要理解它,可以参考我写的注释。
public partial class InitModel : DbMigration { /// <summary> /// 本次迁移执行的具体操作,即升级数据库。 /// </summary> public override void Up() { //创建架构为"dbo",表名为”MyEntities"的数据库表。 CreateTable( "dbo.MyEntities", c => new { Id = c.Int(nullable: false, identity: true),//Id,int类型,不可为空,标识列(自动增长)。 Name = c.String(),//Name,string类型 }) .PrimaryKey(t => t.Id);//设置主键为Id } /// <summary> /// 以后如果回滚数据库,那么会执行此降级方法。 /// </summary> public override void Down() { DropTable("dbo.MyEntities");//删除架构为"dbo",表名为”MyEntities"的数据库表。 } }
第三步:在控制台输入Update-DataBase –script。生成Sql脚本。(在迁移过程中经常奇葩问题的时候,就生成sql脚本检查一下吧。)
CREATE TABLE [dbo].[MyEntities] ( [Id] [int] NOT NULL IDENTITY, [Name] [nvarchar](max), CONSTRAINT [PK_dbo.MyEntities] PRIMARY KEY ([Id]))CREATE TABLE [dbo].[__MigrationHistory] ( [MigrationId] [nvarchar](150) NOT NULL, [ContextKey] [nvarchar](300) NOT NULL, [Model] [varbinary](max) NOT NULL, [ProductVersion] [nvarchar](32) NOT NULL, CONSTRAINT [PK_dbo.__MigrationHistory] PRIMARY KEY ([MigrationId], [ContextKey]))INSERT [dbo].[__MigrationHistory]([MigrationId], [ContextKey], [Model], [ProductVersion])VALUES (N‘201601021118458_InitModel‘, N‘CodeFirstDemo.Migrations.Configuration‘, 0x1F8B0800000000000400CD57DB6E1B37107D0FD07F20F8D400B6E8CB4B6AAC12B8B25D18896C23EBE49DDA1DC94479D9925C43FB6D79C827F5173AD4DE7725457683A2102068676786670EE70CA9BFBF7D8F3EAC9524CF609D307A4A4F272794804E4C2AF46A4A73BF3C7E473FBCFFE54D749DAA35F95AFB9D073F8CD46E4A9FBCCF2E1873C91328EE264A24D638B3F493C428C653C3CE4E4E7E63A7A70C3005C55C84449F73ED8582CD033ECE8C4E20F3399773938274951DDFC49BACE48E2B70194F604A67E87123ACF357A00C259752700411835C52C2B5369E7B8478F1C541ECADD1AB384303978F4506E8B7E4D24105FDA2753FB48A93B350056B03EB5449EEBC512F4C787A5ED1C286E1AF229736B42171D748B02F42D51BF2A6745E94264A868B5DCCA40D8E036E2775C411E9D98F9A36C06E091F7C9F4B9F5B986AC8BDE5F2883CE40B29928F503C9A3F414F752E65171DE2C3773D039A1EACC9C0FAE2332C2BCCB72925AC1FC786814D5827A6ACE656FBF3334AEE7071BE90D06C7EA7F2D81B0B7F8006CB3DA40FDC7BB03AE4808A2BB677ADF05DAF86DD869AA164CED79F40AFFC1352CED794DC8835A4B5A542F0450B941806799B437F9188B53B37DE4F148AE702E1369B1A2CB0F65B761515506DACAB16EAD752668CC1F71B4480A3A4C5504A6BD276CF36B00DAC56B8AC546EAD70B643E2D19C6719F2D6917C652171A5F7E3F8E56A50650E96B82DA268D0362B6117F0150CDE76E5C03D5FF0B073B3548DDCDA4DD84170BDCE88E7A1025ADAEB90F0BB0CDBAECD618A96BF1B2C49611B6FAA83064B67108C4237F3964B6EB7486A6664AEF42E59EE8B2E45D28D2F2DE30C111B601FF2C346040D86C390F27DBD3A7469566F7A76D09B51D5272F39A3AAC6295D28416A9E451A9A262E9C0735090E93F82F399302EB6D1DE65C8B25385FCE4F8A7DFD6E70D6FD7FCE1DE65C2A0F3C7CFEF3434004567F38E64767C4E1735F3F739B3C71FBABE2EBB7DD4CFF76B68FA7CF41F3BBD83BBDCB469CD2748177A7C7126877F0BF72BA8F9511B1EE1D2FBA0227566D8A70E3D39084966B93D63EB77A696AC2B1BC2EA2DA65B01F73F03C45962EAD174B9E787C9D80739BF3F82B9739BA5CAB05A4B7FA3EF759EE2F9D03B590BDD32C62FBD7DF1C617DCCD17D169EDCCF2801610A2C01EEF5EFB9906983FB66DC8FBB528486A99A1C51E17D04D3AD8A26D39DD10726AAE8BB820C7490C823A84C623277AF63FE0CAFC18697914FB0E249510FB8DD497EBC117DDAA32BC157962B57E568E3C3FF1616FEB8BCFF07A10C3040EA0C0000 , N‘6.1.3-40302‘)
如上图所示:第一段创建表MyEntities,是我们的目标,这没错,很正常。
第二段:创建表_MigrationHistory,这是什么鬼。其实这就是EF6框架用来维护模型的表,
[MigrationId]:遍号,主键,存储设计类中Id,其实就是本次迁移记录的名称。
[ContextKey]:标记当前上下文的识别码,主键,因为CodeFirst支持多个上下文实例,所以用这个字段来标记。
[Model]:模型,当前模型的具体描述,加密了。
[ProductVersion]:EF框架的版本号。
EF6框架通过这张表具体记录每次迁移变化,也是通过这张表来检查程序中的对象和数据库中的关系是否一致。
下面继续在控制台输入:Update-DataBase –verbose(或者-v)。更新数据库,并且查看执行的具体sql语句。
结果:
哦,通过查看错误信息,我们可以知道原来是当前配置的是MSSqlServer,而我本机又没有安装MSSqlServer数据库实例,所以当然连接不上了。我们的目标是MySql数据库,所以就要修改App.config中连接字符串了。
打开App.config:
找到连接字符串:
<connectionStrings> <add name="MyContext" connectionString="data source=(LocalDb)MSSQLLocalDB;initial catalog=CodeFirstDemo.MyContext;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" /> </connectionStrings>
修改为MySql的连接字符串:
<connectionStrings> <add name="MyContext" connectionString="Data Source=127.0.0.1;port=3306;Initial Catalog=CodeFirstDemoDb;user id=root;password=1234;" providerName="MySql.Data.MySqlClient"/> </connectionStrings>
再次在控制台输入:Update-DataBase –verbose。
这是因为当前的Sql生成器依然是MSSqlServer,那么如何启动MySql的Sql生成器呢?
在Migration文件夹中的配置类Congifuration的构造方法中:
public Configuration() { AutomaticMigrationsEnabled = false; SetSqlGenerator("MySql.Data.MySqlClient", new MySql.Data.Entity.MySqlMigrationSqlGenerator());//设置Sql生成器为Mysql的 }
再次在控制台输入:Update-DataBase –verbose。
我擦泪!!!
这是MyEntity.Name属性为string类型,直接映射到MySql中的话是longtext,而MySql支持最大长度为767bytes。
可以用的是DataAnnotations(数据注释)方式,配置MyEntity.Name属性的映射规则:
public class MyEntity { public int Id { get; set; } [MaxLength(100)] public string Name { get; set; } }
未完待续……
EF6(CodeFirst)+Mysql开发脱坑指南
标签:
EF core使用code first无法为mysql数据表设置字段默认值,该怎么办...
connectionStrings> <add name="MyContext" connectionString="data source=(LocalDb)MSSQLLocalDB;initial catalog=CodeFirstDemo.MyContext;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" /></connectionStrings>
很显然这是默认的MSSqlServer的配置,稍后再来修改。
3、在MyContext中,反注释掉MyEntities极其实现类代码。
public virtual DbSet<MyEntity> MyEntities { get; set; }
public class MyEntity { public int Id { get; set; } public string Name { get; set; } }
这就是程序中的对象。
根据CodeFirst的约定:Id会被设置为主键。
更多约定详见msdn(https://msdn.microsoft.com/zh-cn/data/jj679962)。
4、如何把MyEntities映射到MySql数据库中?。 三步走:
打开vs工具
第一步: 在控制台中输入Enable-Migrations(启动迁移)。注意:默认项目一定要是模型所在的项目。
此时项目中会自动生成Migration文件夹
下面我来解释下Configuration.cs类
这是迁移的配置类,在最后执行迁移的时候会执行这个类。
它有两个方法:
a、Congifuration():无参的构造方法。可以在这里配置迁移之前的操作,后文再详细描述。
b、Send(MyContext):void:这个方法是在执行迁移成功之后执行,一般用来初始化数据库用的。例如:我要在生成数据库的时候就初始化一个MyEntities记录。
protected override void Seed(CodeFirstDemo.MyContext context) { // This method will be called after migrating to the latest version. // You can use the DbSet<T>.AddOrUpdate() helper extension method // to avoid creating duplicate seed data. E.g. // // context.People.AddOrUpdate( // p => p.FullName, // new Person { FullName = "Andrew Peters" }, // new Person { FullName = "Brice Lambson" }, // new Person { FullName = "Rowan Miller" } // ); // context.MyEntities.AddOrUpdate(new MyEntity() { Name = "张三" }); context.SaveChanges(); }
第二步:在控制台输入:Add-Migration InitModel。(InitModel:为本次迁移起个名字)
此时在项目的Migration文件夹中会自动生成迁移记录文件,文件名以当前时间_本次迁移的名字作为类名。
记录文件有一个设计类和一个资源类和一个迁移具体操作的方法。
设计类:本次迁移的具体记录。自动生成、维护。
资源类:默认架构和目标。自动生成、维护。
具体操作:该类维护Up()和Down()两个方法,分别用于升级和降级。有时候需要我们自己定制,因此要理解它,可以参考我写的注释。
public partial class InitModel : DbMigration { /// <summary> /// 本次迁移执行的具体操作,即升级数据库。 /// </summary> public override void Up() { //创建架构为"dbo",表名为”MyEntities"的数据库表。 CreateTable( "dbo.MyEntities", c => new { Id = c.Int(nullable: false, identity: true),//Id,int类型,不可为空,标识列(自动增长)。 Name = c.String(),//Name,string类型 }) .PrimaryKey(t => t.Id);//设置主键为Id } /// <summary> /// 以后如果回滚数据库,那么会执行此降级方法。 /// </summary> public override void Down() { DropTable("dbo.MyEntities");//删除架构为"dbo",表名为”MyEntities"的数据库表。 } }
第三步:在控制台输入Update-DataBase –script。生成Sql脚本。(在迁移过程中经常奇葩问题的时候,就生成sql脚本检查一下吧。)
CREATE TABLE [dbo].[MyEntities] ( [Id] [int] NOT NULL IDENTITY, [Name] [nvarchar](max), CONSTRAINT [PK_dbo.MyEntities] PRIMARY KEY ([Id]))CREATE TABLE [dbo].[__MigrationHistory] ( [MigrationId] [nvarchar](150) NOT NULL, [ContextKey] [nvarchar](300) NOT NULL, [Model] [varbinary](max) NOT NULL, [ProductVersion] [nvarchar](32) NOT NULL, CONSTRAINT [PK_dbo.__MigrationHistory] PRIMARY KEY ([MigrationId], [ContextKey]))INSERT [dbo].[__MigrationHistory]([MigrationId], [ContextKey], [Model], [ProductVersion])VALUES (N‘201601021118458_InitModel‘, N‘CodeFirstDemo.Migrations.Configuration‘, 0x1F8B0800000000000400CD57DB6E1B37107D0FD07F20F8D400B6E8CB4B6AAC12B8B25D18896C23EBE49DDA1DC94479D9925C43FB6D79C827F5173AD4DE7725457683A2102068676786670EE70CA9BFBF7D8F3EAC9524CF609D307A4A4F272794804E4C2AF46A4A73BF3C7E473FBCFFE54D749DAA35F95AFB9D073F8CD46E4A9FBCCF2E1873C91328EE264A24D638B3F493C428C653C3CE4E4E7E63A7A70C3005C55C84449F73ED8582CD033ECE8C4E20F3399773938274951DDFC49BACE48E2B70194F604A67E87123ACF357A00C259752700411835C52C2B5369E7B8478F1C541ECADD1AB384303978F4506E8B7E4D24105FDA2753FB48A93B350056B03EB5449EEBC512F4C787A5ED1C286E1AF229736B42171D748B02F42D51BF2A6745E94264A868B5DCCA40D8E036E2775C411E9D98F9A36C06E091F7C9F4B9F5B986AC8BDE5F2883CE40B29928F503C9A3F414F752E65171DE2C3773D039A1EACC9C0FAE2332C2BCCB72925AC1FC786814D5827A6ACE656FBF3334AEE7071BE90D06C7EA7F2D81B0B7F8006CB3DA40FDC7BB03AE4808A2BB677ADF05DAF86DD869AA164CED79F40AFFC1352CED794DC8835A4B5A542F0450B941806799B437F9188B53B37DE4F148AE702E1369B1A2CB0F65B761515506DACAB16EAD752668CC1F71B4480A3A4C5504A6BD276CF36B00DAC56B8AC546EAD70B643E2D19C6719F2D6917C652171A5F7E3F8E56A50650E96B82DA268D0362B6117F0150CDE76E5C03D5FF0B073B3548DDCDA4DD84170BDCE88E7A1025ADAEB90F0BB0CDBAECD618A96BF1B2C49611B6FAA83064B67108C4237F3964B6EB7486A6664AEF42E59EE8B2E45D28D2F2DE30C111B601FF2C346040D86C390F27DBD3A7469566F7A76D09B51D5272F39A3AAC6295D28416A9E451A9A262E9C0735090E93F82F399302EB6D1DE65C8B25385FCE4F8A7DFD6E70D6FD7FCE1DE65C2A0F3C7CFEF3434004567F38E64767C4E1735F3F739B3C71FBABE2EBB7DD4CFF76B68FA7CF41F3BBD83BBDCB469CD2748177A7C7126877F0BF72BA8F9511B1EE1D2FBA0227566D8A70E3D39084966B93D63EB77A696AC2B1BC2EA2DA65B01F73F03C45962EAD174B9E787C9D80739BF3F82B9739BA5CAB05A4B7FA3EF759EE2F9D03B590BDD32C62FBD7DF1C617DCCD17D169EDCCF2801610A2C01EEF5EFB9906983FB66DC8FBB528486A99A1C51E17D04D3AD8A26D39DD10726AAE8BB820C7490C823A84C623277AF63FE0CAFC18697914FB0E249510FB8DD497EBC117DDAA32BC157962B57E568E3C3FF1616FEB8BCFF07A10C3040EA0C0000 , N‘6.1.3-40302‘)
如上图所示:第一段创建表MyEntities,是我们的目标,这没错,很正常。
第二段:创建表_MigrationHistory,这是什么鬼。其实这就是EF6框架用来维护模型的表,
[MigrationId]:遍号,主键,存储设计类中Id,其实就是本次迁移记录的名称。
[ContextKey]:标记当前上下文的识别码,主键,因为CodeFirst支持多个上下文实例,所以用这个字段来标记。
[Model]:模型,当前模型的具体描述,加密了。
[ProductVersion]:EF框架的版本号。
EF6框架通过这张表具体记录每次迁移变化,也是通过这张表来检查程序中的对象和数据库中的关系是否一致。
下面继续在控制台输入:Update-DataBase –verbose(或者-v)。更新数据库,并且查看执行的具体sql语句。
结果:
哦,通过查看错误信息,我们可以知道原来是当前配置的是MSSqlServer,而我本机又没有安装MSSqlServer数据库实例,所以当然连接不上了。我们的目标是MySql数据库,所以就要修改App.config中连接字符串了。
打开App.config:
找到连接字符串:
<connectionStrings> <add name="MyContext" connectionString="data source=(LocalDb)MSSQLLocalDB;initial catalog=CodeFirstDemo.MyContext;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" /> </connectionStrings>
修改为MySql的连接字符串:
<connectionStrings> <add name="MyContext" connectionString="Data Source=127.0.0.1;port=3306;Initial Catalog=CodeFirstDemoDb;user id=root;password=1234;" providerName="MySql.Data.MySqlClient"/> </connectionStrings>
再次在控制台输入:Update-DataBase –verbose。
这是因为当前的Sql生成器依然是MSSqlServer,那么如何启动MySql的Sql生成器呢?
在Migration文件夹中的配置类Congifuration的构造方法中:
public Configuration() { AutomaticMigrationsEnabled = false; SetSqlGenerator("MySql.Data.MySqlClient", new MySql.Data.Entity.MySqlMigrationSqlGenerator());//设置Sql生成器为Mysql的 }
再次在控制台输入:Update-DataBase –verbose。
我擦泪!!!
这是MyEntity.Name属性为string类型,直接映射到MySql中的话是longtext,而MySql支持最大长度为767bytes。
可以用的是DataAnnotations(数据注释)方式,配置MyEntity.Name属性的映射规则:
public class MyEntity { public int Id { get; set; } [MaxLength(100)] public string Name { get; set; } }
未完待续……
EF6(CodeFirst)+Mysql开发脱坑指南
标签:
EF code first 怎样创建数据库视图
1. 使用CodeFirst方式创建数据库
我们新建一个控制台项目,项目中添加两个Model:Author和Blog以及DbContext。 DbContext的添加方式如下:
项目上右键->添加->新建项->ADO.NET Entity Data Model->Empty Code First model
项目代码如下:
1 //默认生成的数据表名为类名+字母s,这里使用TableAttribute来指定数据表名为T_Authors
2 [Table("T_Authors")]
3 public class Author
4 {
5 public int Id { set; get; }
6 public string Name { set; get; }
7 /*
8 此处定义了Blog类型的属性,所以要确保Blog类中至少要有一个表示主键的字段,即public int Id { set; get; }。
否则在生成数据表时会报错:"EntityType 'Blog' has no key defined. Define the key for this EntityType.
9 Blogs: EntityType: EntitySet 'Blogs' is based on type 'Blog' that has no keys defined."
10 */
11 public virtual ICollection<Blog> Blogs { set; get; }
12 }
13
14 [Table("T_Blogs")]
15 public class Blog
16 {
17 public int Id { set; get; }
18 public string Title { set; get; }
19 public DateTime Time { set; get; }
20 public int AuthorId { set; get; }
21 public virtual Author Author { set; get; }
22 }
23
24 public class MyDbContext: DbContext
25 {
26 public MyDbContext()
27 : base("name=MyDbContext")
28 {
29 }
30 //DbContext会根据配置文件中connectionStrings指定的数据库名称来建立数据库
31 //DbContext根据DbSet属性的类型来创建数据表,这里指定了Author类型的属性,所以会生成T_Authors数据表
32 public virtual DbSet<Author> Authors { set; get; }
33 }
CodeFirst方式会根据配置文件中的配置生成数据库,这里小编使用的是MYSQL数据库,配置文件如下:
1 <!--EF for MYSQL-->
2 <entityFramework codeConfigurationType="MySql.Data.Entity.MySqlEFConfiguration, MySql.Data.Entity.EF6">
3 <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
4 <providers>
5 <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6" />
6 </providers>
7 </entityFramework>
8 <connectionStrings>
9 <add name="MyDbContext" connectionString="server=localhost;port=3306;database=EF;uid=root;password=root" providerName="System.Data.MySqlClient" />
10 </connectionStrings>
PS:小编使用的是EF6和MYSQL数据库,所以要在项目中添加对Mysql.Data.Entity.EF6以及EntityFrameword 6.0的引用。
到此,我们已经完成生成数据库的工作,接下来在Main方法中写两行代码:
1 using (var db = new ManagerDb())
2 {
3 db.Authors.Add(new Author() { Name = "xfh" });
4 db.SaveChanges();
5 }
EF code first 怎样创建数据库视图
1. 使用CodeFirst方式创建数据库
我们新建一个控制台项目,项目中添加两个Model:Author和Blog以及DbContext。 DbContext的添加方式如下:
项目上右键->添加->新建项->ADO.NET Entity Data Model->Empty Code First model
项目代码如下:
1 //默认生成的数据表名为类名+字母s,这里使用TableAttribute来指定数据表名为T_Authors
2 [Table("T_Authors")]
3 public class Author
4 {
5 public int Id { set; get; }
6 public string Name { set; get; }
7 /*
8 此处定义了Blog类型的属性,所以要确保Blog类中至少要有一个表示主键的字段,即public int Id { set; get; }。
否则在生成数据表时会报错:"EntityType 'Blog' has no key defined. Define the key for this EntityType.
9 Blogs: EntityType: EntitySet 'Blogs' is based on type 'Blog' that has no keys defined."
10 */
11 public virtual ICollection<Blog> Blogs { set; get; }
12 }
13
14 [Table("T_Blogs")]
15 public class Blog
16 {
17 public int Id { set; get; }
18 public string Title { set; get; }
19 public DateTime Time { set; get; }
20 public int AuthorId { set; get; }
21 public virtual Author Author { set; get; }
22 }
23
24 public class MyDbContext: DbContext
25 {
26 public MyDbContext()
27 : base("name=MyDbContext")
28 {
29 }
30 //DbContext会根据配置文件中connectionStrings指定的数据库名称来建立数据库
31 //DbContext根据DbSet属性的类型来创建数据表,这里指定了Author类型的属性,所以会生成T_Authors数据表
32 public virtual DbSet<Author> Authors { set; get; }
33 }
CodeFirst方式会根据配置文件中的配置生成数据库,这里小编使用的是MYSQL数据库,配置文件如下:
1 <!--EF for MYSQL-->
2 <entityFramework codeConfigurationType="MySql.Data.Entity.MySqlEFConfiguration, MySql.Data.Entity.EF6">
3 <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
4 <providers>
5 <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6" />
6 </providers>
7 </entityFramework>
8 <connectionStrings>
9 <add name="MyDbContext" connectionString="server=localhost;port=3306;database=EF;uid=root;password=root" providerName="System.Data.MySqlClient" />
10 </connectionStrings>
PS:小编使用的是EF6和MYSQL数据库,所以要在项目中添加对Mysql.Data.Entity.EF6以及EntityFrameword 6.0的引用。
到此,我们已经完成生成数据库的工作,接下来在Main方法中写两行代码:
1 using (var db = new ManagerDb())
2 {
3 db.Authors.Add(new Author() { Name = "xfh" });
4 db.SaveChanges();
5 }
EF6 CodeFirst双向一对一非主键关联怎么指定
connectionStrings> <add name="MyContext" connectionString="data source=(LocalDb)MSSQLLocalDB;initial catalog=CodeFirstDemo.MyContext;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" /></connectionStrings>
很显然这是默认的MSSqlServer的配置,稍后再来修改。
3、在MyContext中,反注释掉MyEntities极其实现类代码。
public virtual DbSet<MyEntity> MyEntities { get; set; }
public class MyEntity { public int Id { get; set; } public string Name { get; set; } }
这就是程序中的对象。
根据CodeFirst的约定:Id会被设置为主键。
更多约定详见msdn(https://msdn.microsoft.com/zh-cn/data/jj679962)。
4、如何把MyEntities映射到MySql数据库中?。 三步走:
打开vs工具
第一步: 在控制台中输入Enable-Migrations(启动迁移)。注意:默认项目一定要是模型所在的项目。
此时项目中会自动生成Migration文件夹
下面我来解释下Configuration.cs类
这是迁移的配置类,在最后执行迁移的时候会执行这个类。
它有两个方法:
a、Congifuration():无参的构造方法。可以在这里配置迁移之前的操作,后文再详细描述。
b、Send(MyContext):void:这个方法是在执行迁移成功之后执行,一般用来初始化数据库用的。例如:我要在生成数据库的时候就初始化一个MyEntities记录。
protected override void Seed(CodeFirstDemo.MyContext context) { // This method will be called after migrating to the latest version. // You can use the DbSet<T>.AddOrUpdate() helper extension method // to avoid creating duplicate seed data. E.g. // // context.People.AddOrUpdate( // p => p.FullName, // new Person { FullName = "Andrew Peters" }, // new Person { FullName = "Brice Lambson" }, // new Person { FullName = "Rowan Miller" } // ); // context.MyEntities.AddOrUpdate(new MyEntity() { Name = "张三" }); context.SaveChanges(); }
第二步:在控制台输入:Add-Migration InitModel。(InitModel:为本次迁移起个名字)
此时在项目的Migration文件夹中会自动生成迁移记录文件,文件名以当前时间_本次迁移的名字作为类名。
记录文件有一个设计类和一个资源类和一个迁移具体操作的方法。
设计类:本次迁移的具体记录。自动生成、维护。
资源类:默认架构和目标。自动生成、维护。
具体操作:该类维护Up()和Down()两个方法,分别用于升级和降级。有时候需要我们自己定制,因此要理解它,可以参考我写的注释。
public partial class InitModel : DbMigration { /// <summary> /// 本次迁移执行的具体操作,即升级数据库。 /// </summary> public override void Up() { //创建架构为"dbo",表名为”MyEntities"的数据库表。 CreateTable( "dbo.MyEntities", c => new { Id = c.Int(nullable: false, identity: true),//Id,int类型,不可为空,标识列(自动增长)。 Name = c.String(),//Name,string类型 }) .PrimaryKey(t => t.Id);//设置主键为Id } /// <summary> /// 以后如果回滚数据库,那么会执行此降级方法。 /// </summary> public override void Down() { DropTable("dbo.MyEntities");//删除架构为"dbo",表名为”MyEntities"的数据库表。 } }
第三步:在控制台输入Update-DataBase –script。生成Sql脚本。(在迁移过程中经常奇葩问题的时候,就生成sql脚本检查一下吧。)
CREATE TABLE [dbo].[MyEntities] ( [Id] [int] NOT NULL IDENTITY, [Name] [nvarchar](max), CONSTRAINT [PK_dbo.MyEntities] PRIMARY KEY ([Id]))CREATE TABLE [dbo].[__MigrationHistory] ( [MigrationId] [nvarchar](150) NOT NULL, [ContextKey] [nvarchar](300) NOT NULL, [Model] [varbinary](max) NOT NULL, [ProductVersion] [nvarchar](32) NOT NULL, CONSTRAINT [PK_dbo.__MigrationHistory] PRIMARY KEY ([MigrationId], [ContextKey]))INSERT [dbo].[__MigrationHistory]([MigrationId], [ContextKey], [Model], [ProductVersion])VALUES (N‘201601021118458_InitModel‘, N‘CodeFirstDemo.Migrations.Configuration‘, 0x1F8B0800000000000400CD57DB6E1B37107D0FD07F20F8D400B6E8CB4B6AAC12B8B25D18896C23EBE49DDA1DC94479D9925C43FB6D79C827F5173AD4DE7725457683A2102068676786670EE70CA9BFBF7D8F3EAC9524CF609D307A4A4F272794804E4C2AF46A4A73BF3C7E473FBCFFE54D749DAA35F95AFB9D073F8CD46E4A9FBCCF2E1873C91328EE264A24D638B3F493C428C653C3CE4E4E7E63A7A70C3005C55C84449F73ED8582CD033ECE8C4E20F3399773938274951DDFC49BACE48E2B70194F604A67E87123ACF357A00C259752700411835C52C2B5369E7B8478F1C541ECADD1AB384303978F4506E8B7E4D24105FDA2753FB48A93B350056B03EB5449EEBC512F4C787A5ED1C286E1AF229736B42171D748B02F42D51BF2A6745E94264A868B5DCCA40D8E036E2775C411E9D98F9A36C06E091F7C9F4B9F5B986AC8BDE5F2883CE40B29928F503C9A3F414F752E65171DE2C3773D039A1EACC9C0FAE2332C2BCCB72925AC1FC786814D5827A6ACE656FBF3334AEE7071BE90D06C7EA7F2D81B0B7F8006CB3DA40FDC7BB03AE4808A2BB677ADF05DAF86DD869AA164CED79F40AFFC1352CED794DC8835A4B5A542F0450B941806799B437F9188B53B37DE4F148AE702E1369B1A2CB0F65B761515506DACAB16EAD752668CC1F71B4480A3A4C5504A6BD276CF36B00DAC56B8AC546EAD70B643E2D19C6719F2D6917C652171A5F7E3F8E56A50650E96B82DA268D0362B6117F0150CDE76E5C03D5FF0B073B3548DDCDA4DD84170BDCE88E7A1025ADAEB90F0BB0CDBAECD618A96BF1B2C49611B6FAA83064B67108C4237F3964B6EB7486A6664AEF42E59EE8B2E45D28D2F2DE30C111B601FF2C346040D86C390F27DBD3A7469566F7A76D09B51D5272F39A3AAC6295D28416A9E451A9A262E9C0735090E93F82F399302EB6D1DE65C8B25385FCE4F8A7DFD6E70D6FD7FCE1DE65C2A0F3C7CFEF3434004567F38E64767C4E1735F3F739B3C71FBABE2EBB7DD4CFF76B68FA7CF41F3BBD83BBDCB469CD2748177A7C7126877F0BF72BA8F9511B1EE1D2FBA0227566D8A70E3D39084966B93D63EB77A696AC2B1BC2EA2DA65B01F73F03C45962EAD174B9E787C9D80739BF3F82B9739BA5CAB05A4B7FA3EF759EE2F9D03B590BDD32C62FBD7DF1C617DCCD17D169EDCCF2801610A2C01EEF5EFB9906983FB66DC8FBB528486A99A1C51E17D04D3AD8A26D39DD10726AAE8BB820C7490C823A84C623277AF63FE0CAFC18697914FB0E249510FB8DD497EBC117DDAA32BC157962B57E568E3C3FF1616FEB8BCFF07A10C3040EA0C0000 , N‘6.1.3-40302‘)
如上图所示:第一段创建表MyEntities,是我们的目标,这没错,很正常。
第二段:创建表_MigrationHistory,这是什么鬼。其实这就是EF6框架用来维护模型的表,
[MigrationId]:遍号,主键,存储设计类中Id,其实就是本次迁移记录的名称。
[ContextKey]:标记当前上下文的识别码,主键,因为CodeFirst支持多个上下文实例,所以用这个字段来标记。
[Model]:模型,当前模型的具体描述,加密了。
[ProductVersion]:EF框架的版本号。
EF6框架通过这张表具体记录每次迁移变化,也是通过这张表来检查程序中的对象和数据库中的关系是否一致。
下面继续在控制台输入:Update-DataBase –verbose(或者-v)。更新数据库,并且查看执行的具体sql语句。
结果:
哦,通过查看错误信息,我们可以知道原来是当前配置的是MSSqlServer,而我本机又没有安装MSSqlServer数据库实例,所以当然连接不上了。我们的目标是MySql数据库,所以就要修改App.config中连接字符串了。
打开App.config:
找到连接字符串:
<connectionStrings> <add name="MyContext" connectionString="data source=(LocalDb)MSSQLLocalDB;initial catalog=CodeFirstDemo.MyContext;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" /> </connectionStrings>
修改为MySql的连接字符串:
<connectionStrings> <add name="MyContext" connectionString="Data Source=127.0.0.1;port=3306;Initial Catalog=CodeFirstDemoDb;user id=root;password=1234;" providerName="MySql.Data.MySqlClient"/> </connectionStrings>
再次在控制台输入:Update-DataBase –verbose。
这是因为当前的Sql生成器依然是MSSqlServer,那么如何启动MySql的Sql生成器呢?
在Migration文件夹中的配置类Congifuration的构造方法中:
public Configuration() { AutomaticMigrationsEnabled = false; SetSqlGenerator("MySql.Data.MySqlClient", new MySql.Data.Entity.MySqlMigrationSqlGenerator());//设置Sql生成器为Mysql的 }
再次在控制台输入:Update-DataBase –verbose。
我擦泪!!!
这是MyEntity.Name属性为string类型,直接映射到MySql中的话是longtext,而MySql支持最大长度为767bytes。
可以用的是DataAnnotations(数据注释)方式,配置MyEntity.Name属性的映射规则:
public class MyEntity { public int Id { get; set; } [MaxLength(100)] public string Name { get; set; } }
未完待续……
EF6(CodeFirst)+Mysql开发脱坑指南
标签:
EF6 CodeFirst双向一对一非主键关联怎么指定
connectionStrings> <add name="MyContext" connectionString="data source=(LocalDb)MSSQLLocalDB;initial catalog=CodeFirstDemo.MyContext;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" /></connectionStrings>
很显然这是默认的MSSqlServer的配置,稍后再来修改。
3、在MyContext中,反注释掉MyEntities极其实现类代码。
public virtual DbSet<MyEntity> MyEntities { get; set; }
public class MyEntity { public int Id { get; set; } public string Name { get; set; } }
这就是程序中的对象。
根据CodeFirst的约定:Id会被设置为主键。
更多约定详见msdn(https://msdn.microsoft.com/zh-cn/data/jj679962)。
4、如何把MyEntities映射到MySql数据库中?。 三步走:
打开vs工具
第一步: 在控制台中输入Enable-Migrations(启动迁移)。注意:默认项目一定要是模型所在的项目。
此时项目中会自动生成Migration文件夹
下面我来解释下Configuration.cs类
这是迁移的配置类,在最后执行迁移的时候会执行这个类。
它有两个方法:
a、Congifuration():无参的构造方法。可以在这里配置迁移之前的操作,后文再详细描述。
b、Send(MyContext):void:这个方法是在执行迁移成功之后执行,一般用来初始化数据库用的。例如:我要在生成数据库的时候就初始化一个MyEntities记录。
protected override void Seed(CodeFirstDemo.MyContext context) { // This method will be called after migrating to the latest version. // You can use the DbSet<T>.AddOrUpdate() helper extension method // to avoid creating duplicate seed data. E.g. // // context.People.AddOrUpdate( // p => p.FullName, // new Person { FullName = "Andrew Peters" }, // new Person { FullName = "Brice Lambson" }, // new Person { FullName = "Rowan Miller" } // ); // context.MyEntities.AddOrUpdate(new MyEntity() { Name = "张三" }); context.SaveChanges(); }
第二步:在控制台输入:Add-Migration InitModel。(InitModel:为本次迁移起个名字)
此时在项目的Migration文件夹中会自动生成迁移记录文件,文件名以当前时间_本次迁移的名字作为类名。
记录文件有一个设计类和一个资源类和一个迁移具体操作的方法。
设计类:本次迁移的具体记录。自动生成、维护。
资源类:默认架构和目标。自动生成、维护。
具体操作:该类维护Up()和Down()两个方法,分别用于升级和降级。有时候需要我们自己定制,因此要理解它,可以参考我写的注释。
public partial class InitModel : DbMigration { /// <summary> /// 本次迁移执行的具体操作,即升级数据库。 /// </summary> public override void Up() { //创建架构为"dbo",表名为”MyEntities"的数据库表。 CreateTable( "dbo.MyEntities", c => new { Id = c.Int(nullable: false, identity: true),//Id,int类型,不可为空,标识列(自动增长)。 Name = c.String(),//Name,string类型 }) .PrimaryKey(t => t.Id);//设置主键为Id } /// <summary> /// 以后如果回滚数据库,那么会执行此降级方法。 /// </summary> public override void Down() { DropTable("dbo.MyEntities");//删除架构为"dbo",表名为”MyEntities"的数据库表。 } }
第三步:在控制台输入Update-DataBase –script。生成Sql脚本。(在迁移过程中经常奇葩问题的时候,就生成sql脚本检查一下吧。)
CREATE TABLE [dbo].[MyEntities] ( [Id] [int] NOT NULL IDENTITY, [Name] [nvarchar](max), CONSTRAINT [PK_dbo.MyEntities] PRIMARY KEY ([Id]))CREATE TABLE [dbo].[__MigrationHistory] ( [MigrationId] [nvarchar](150) NOT NULL, [ContextKey] [nvarchar](300) NOT NULL, [Model] [varbinary](max) NOT NULL, [ProductVersion] [nvarchar](32) NOT NULL, CONSTRAINT [PK_dbo.__MigrationHistory] PRIMARY KEY ([MigrationId], [ContextKey]))INSERT [dbo].[__MigrationHistory]([MigrationId], [ContextKey], [Model], [ProductVersion])VALUES (N‘201601021118458_InitModel‘, N‘CodeFirstDemo.Migrations.Configuration‘, 0x1F8B0800000000000400CD57DB6E1B37107D0FD07F20F8D400B6E8CB4B6AAC12B8B25D18896C23EBE49DDA1DC94479D9925C43FB6D79C827F5173AD4DE7725457683A2102068676786670EE70CA9BFBF7D8F3EAC9524CF609D307A4A4F272794804E4C2AF46A4A73BF3C7E473FBCFFE54D749DAA35F95AFB9D073F8CD46E4A9FBCCF2E1873C91328EE264A24D638B3F493C428C653C3CE4E4E7E63A7A70C3005C55C84449F73ED8582CD033ECE8C4E20F3399773938274951DDFC49BACE48E2B70194F604A67E87123ACF357A00C259752700411835C52C2B5369E7B8478F1C541ECADD1AB384303978F4506E8B7E4D24105FDA2753FB48A93B350056B03EB5449EEBC512F4C787A5ED1C286E1AF229736B42171D748B02F42D51BF2A6745E94264A868B5DCCA40D8E036E2775C411E9D98F9A36C06E091F7C9F4B9F5B986AC8BDE5F2883CE40B29928F503C9A3F414F752E65171DE2C3773D039A1EACC9C0FAE2332C2BCCB72925AC1FC786814D5827A6ACE656FBF3334AEE7071BE90D06C7EA7F2D81B0B7F8006CB3DA40FDC7BB03AE4808A2BB677ADF05DAF86DD869AA164CED79F40AFFC1352CED794DC8835A4B5A542F0450B941806799B437F9188B53B37DE4F148AE702E1369B1A2CB0F65B761515506DACAB16EAD752668CC1F71B4480A3A4C5504A6BD276CF36B00DAC56B8AC546EAD70B643E2D19C6719F2D6917C652171A5F7E3F8E56A50650E96B82DA268D0362B6117F0150CDE76E5C03D5FF0B073B3548DDCDA4DD84170BDCE88E7A1025ADAEB90F0BB0CDBAECD618A96BF1B2C49611B6FAA83064B67108C4237F3964B6EB7486A6664AEF42E59EE8B2E45D28D2F2DE30C111B601FF2C346040D86C390F27DBD3A7469566F7A76D09B51D5272F39A3AAC6295D28416A9E451A9A262E9C0735090E93F82F399302EB6D1DE65C8B25385FCE4F8A7DFD6E70D6FD7FCE1DE65C2A0F3C7CFEF3434004567F38E64767C4E1735F3F739B3C71FBABE2EBB7DD4CFF76B68FA7CF41F3BBD83BBDCB469CD2748177A7C7126877F0BF72BA8F9511B1EE1D2FBA0227566D8A70E3D39084966B93D63EB77A696AC2B1BC2EA2DA65B01F73F03C45962EAD174B9E787C9D80739BF3F82B9739BA5CAB05A4B7FA3EF759EE2F9D03B590BDD32C62FBD7DF1C617DCCD17D169EDCCF2801610A2C01EEF5EFB9906983FB66DC8FBB528486A99A1C51E17D04D3AD8A26D39DD10726AAE8BB820C7490C823A84C623277AF63FE0CAFC18697914FB0E249510FB8DD497EBC117DDAA32BC157962B57E568E3C3FF1616FEB8BCFF07A10C3040EA0C0000 , N‘6.1.3-40302‘)
如上图所示:第一段创建表MyEntities,是我们的目标,这没错,很正常。
第二段:创建表_MigrationHistory,这是什么鬼。其实这就是EF6框架用来维护模型的表,
[MigrationId]:遍号,主键,存储设计类中Id,其实就是本次迁移记录的名称。
[ContextKey]:标记当前上下文的识别码,主键,因为CodeFirst支持多个上下文实例,所以用这个字段来标记。
[Model]:模型,当前模型的具体描述,加密了。
[ProductVersion]:EF框架的版本号。
EF6框架通过这张表具体记录每次迁移变化,也是通过这张表来检查程序中的对象和数据库中的关系是否一致。
下面继续在控制台输入:Update-DataBase –verbose(或者-v)。更新数据库,并且查看执行的具体sql语句。
结果:
哦,通过查看错误信息,我们可以知道原来是当前配置的是MSSqlServer,而我本机又没有安装MSSqlServer数据库实例,所以当然连接不上了。我们的目标是MySql数据库,所以就要修改App.config中连接字符串了。
打开App.config:
找到连接字符串:
<connectionStrings> <add name="MyContext" connectionString="data source=(LocalDb)MSSQLLocalDB;initial catalog=CodeFirstDemo.MyContext;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" /> </connectionStrings>
修改为MySql的连接字符串:
<connectionStrings> <add name="MyContext" connectionString="Data Source=127.0.0.1;port=3306;Initial Catalog=CodeFirstDemoDb;user id=root;password=1234;" providerName="MySql.Data.MySqlClient"/> </connectionStrings>
再次在控制台输入:Update-DataBase –verbose。
这是因为当前的Sql生成器依然是MSSqlServer,那么如何启动MySql的Sql生成器呢?
在Migration文件夹中的配置类Congifuration的构造方法中:
public Configuration() { AutomaticMigrationsEnabled = false; SetSqlGenerator("MySql.Data.MySqlClient", new MySql.Data.Entity.MySqlMigrationSqlGenerator());//设置Sql生成器为Mysql的 }
再次在控制台输入:Update-DataBase –verbose。
我擦泪!!!
这是MyEntity.Name属性为string类型,直接映射到MySql中的话是longtext,而MySql支持最大长度为767bytes。
可以用的是DataAnnotations(数据注释)方式,配置MyEntity.Name属性的映射规则:
public class MyEntity { public int Id { get; set; } [MaxLength(100)] public string Name { get; set; } }
未完待续……
EF6(CodeFirst)+Mysql开发脱坑指南
标签:
MySQL与Redis数据库连接池介绍(图示+源码+代码演示)
数据库连接池(Connection pooling)是程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态地对池中的连接进行申请,使用,释放。
简单的说:创建数据库连接是一个很耗时的操作,也容易对数据库造成安全隐患。所以,在程序初始化的时候,集中创建多个数据库连接,并把他们集中管理,供程序使用,可以保证较快的数据库读写速度,还更加安全可靠。
不使用数据库连接池
如果不使用数据库连接池,对于每一次SQL操作,都要走一遍下面完整的流程:
1.TCP建立连接的三次握手(客户端与 MySQL服务器的连接基于TCP协议)
2.MySQL认证的三次我收
3.真正的SQL执行
4.MySQL的关闭
5.TCP的四次握手关闭
可以看出来,为了执行一条SQL,需要进行大量的初始化与关闭操作
使用数据库连接池
如果使用数据库连接池,那么会 事先申请(初始化)好 相关的数据库连接,然后在之后的SQL操作中会复用这些数据库连接,操作结束之后数据库也不会断开连接,而是将数据库对象放回到数据库连接池中
资源重用:由于数据库连接得到重用,避免了频繁的创建、释放连接引起的性能开销,在减少系统消耗的基础上,另一方面也增进了系统运行环境的平稳性(减少内存碎片以及数据库临时进程/线程的数量)。
更快的系统响应速度:数据库连接池在初始化过程中,往往已经创建了若干数据库连接置于池中备用。 此时连接的初始化工作均已完成。对于业务请求处理而言,直接利用现有可用连接,避免了从数据库连接初始化和释放过程的开销,从而缩减了系统整体响应时间。
统一的连接管理,避免数据库连接泄露:在较为完备的数据库连接池实现中,可根据预先的连接占用超时设定,强制收回被占用连接。从而避免了常规数据库连接操作中可能出现的资源泄露。
如果说你的服务器CPU是4核i7的,连接池大小应该为((4*2)+1)=9
相关视频推荐
90分钟搞懂数据库连接池技术|linux后台开发
《tcp/ip详解卷一》: 150行代码拉开协议栈实现的篇章
学习地址:C/C++Linux服务器开发/后台架构师【零声教育】-学习视频教程-腾讯课堂
需要C/C++ Linux服务器架构师学习资料加qun 812855908 获取(资料包括 C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg 等),免费分享
源码下载
下载方式:https://github.com/dongyusheng/csdn-code/tree/master/db_pool(Github中下载)
db_pool目录下有两个目录,mysql_pool目录为MySQL连接池代码,redis_pool为redis连接池代码
下面介绍mysql_pool
CDBConn解析
概念: 代表一个数据连接对象实例
相关成员:
m_pDBPool:该数据库连接对象所属的数据库连接池
构造函数: 绑定自己所属于哪个数据库连接池
Init()函数: 创建数据库连接句柄
CDBPool解析
概念:代表一个数据库连接池
相关成员:
Init()函数:常见指定数量的数据库实例句柄,然后添加到m_free_list中,供后面使用
GetDBConn()函数: 用于从空闲队列中返回可以使用的数据库连接句柄
RelDBConn()函数: 程序使用完该数据库句柄之后,将句柄放回到空闲队列中
测试之前,将代码中的数据库地址、端口、账号密码等改为自己的(代码中有好几处)
进入MySQL, 创建mysql_pool_test数据库
进入到mysql_pool目录下, 创建一个build目录并进入 :
然后输入如下的命令进行编译
之后就会在目录下生成如下的可执行文件
输入如下两条命令进行测试: 可以看到不使用数据库连接池,整个操作耗时4秒左右;使用连接池之后,整个操作耗时2秒左右,提升了一倍
源码下载
下面介绍redis_pool
测试
进入到redis_pool目录下, 创建一个build目录并进入 :
然后输入如下的命令进行编译
之后就会在目录下生成如下的可执行文件
输入如下的命令进行测试: 可以看到不使用数据库连接池,整个操作耗时182ms;使用连接池之后,整个操作耗时21ms,提升了很多
进入redis,可以看到我们新建的key:
EF core使用code first无法为mysql数据表设置字段默认值,该怎么办
之前本人在用MVC4+EF5+MYSQL搭建自己的博客。地址:www.seesharply.com;遇到一个问题,就是采用ef的codefirst模式来编写程序,我们一般会在程序开发初期直接在global.asax里面加上
System.Data.Entity.Database.SetInitializer(new System.Data.Entity.DropCreateDatabaseIfModelChanges<Farm.Models.FarmContext>());//每次在模型更改的时候重建数据库
或者是、
System.Data.Entity.Database.SetInitializer(new System.Data.Entity.DropCreateDatabaseAlways<Farm.Models.FarmContext>());//每次都重建数据库
在开发初期这样是可取的,我们可以一边完善自己的模型类,然后不停更新数据库;
但是当我们进行到中期,已经产生了一些数据的时候,我们不想每次更新模型然后又要清空数据重建,这个时候,EF为我们提供了Magriation,可以在codeFirst的模式下,当模型发生更改的时候迁移数据,不得不说,EF和微软自家的SQlServer配合的相当默契,这里就不再赘述,这里给一个连接就好:http://www.cnblogs.com/libingql/p/3330880.html
但是EF和MYSQL就没那么好过了,再EF5下本人也是吃了不少苦,然后还是没弄出来,这里贴出个可能的解决方案连接:http://www.nsilverbullet.net/2012/11/07/6-steps-to-get-entity-framework-5-working-with-mysql-5-5/
如果你点开了以上的连接,你会发现EF5下面配置MYSQl的更新其实是比较麻烦,而且很容易出错,至少我是这样,哭晕在厕所;偶然间想到不是有EF6么,于是在EF6中尝试了下,发现十分简单;只用按照以下步骤,轻松搞定:
我们先建好项目,写好模型,仅用于测试:
public class User
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
public Blog Blog { get; set; }
}
public class Blog
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
public string Content { get; set; }
}
然后在Nuget上面添加EntityFrameWork,注意,如果你是MVC5的项目可以直接添加控制器,然后选择带EF的的视图,系统会帮你添加EF6,如果是MVC4,请手动到Nuget撒很添加EF6
添加完毕,然后建立控制器
点添加,这里会自动帮你生成一些列视图操作(不过咱们不需要,需要的儿时那个Context),然后再context类中添加以下代码
好了,再到配置文件里面添加Mysql的连接字符串,名字就是整个Context类中配置的名字,默认就是contextt类名
好了,好了,这里还需要添加Mysql的conecter,于是我们到Nuget上去添加
运行程序
我们再来查看数据库
接下来我们执行迁移:首先添加一个log类
public class Log
{
public int Id { get; set; }
public string Message { get; set; }
}
这时候如果直接运行会报错,我们需要执行迁移;
好了,在程序管理控制台中输入
Enable-Migrations -EnableAutomaticMigrations
执行成功后会帮你添加
我们再到Context类中添加
重新生成项目之后
然后添加Dbset: public DbSet<Log> Logs { get; set; }
在到程序管理控制台输入 add-migration LogTable,我们看到程序帮我们生成了这个,
其实内容就是对表的一系列操作
最后,再倒1程序管理控制台输入 update-database,
执行后,我们来查看数据库
好了,执行成功,祝你好运(学习中,有什么好的建议欢迎留言:www.seesharply.com)
MVC5+EF6+MYSQl,使用codeFirst的数据迁移
标签:
EF core使用code first无法为mysql数据表设置字段默认值,该怎么办
之前本人在用MVC4+EF5+MYSQL搭建自己的博客。地址:www.seesharply.com;遇到一个问题,就是采用ef的codefirst模式来编写程序,我们一般会在程序开发初期直接在global.asax里面加上
System.Data.Entity.Database.SetInitializer(new System.Data.Entity.DropCreateDatabaseIfModelChanges<Farm.Models.FarmContext>());//每次在模型更改的时候重建数据库
或者是、
System.Data.Entity.Database.SetInitializer(new System.Data.Entity.DropCreateDatabaseAlways<Farm.Models.FarmContext>());//每次都重建数据库
在开发初期这样是可取的,我们可以一边完善自己的模型类,然后不停更新数据库;
但是当我们进行到中期,已经产生了一些数据的时候,我们不想每次更新模型然后又要清空数据重建,这个时候,EF为我们提供了Magriation,可以在codeFirst的模式下,当模型发生更改的时候迁移数据,不得不说,EF和微软自家的SQlServer配合的相当默契,这里就不再赘述,这里给一个连接就好:http://www.cnblogs.com/libingql/p/3330880.html
但是EF和MYSQL就没那么好过了,再EF5下本人也是吃了不少苦,然后还是没弄出来,这里贴出个可能的解决方案连接:http://www.nsilverbullet.net/2012/11/07/6-steps-to-get-entity-framework-5-working-with-mysql-5-5/
如果你点开了以上的连接,你会发现EF5下面配置MYSQl的更新其实是比较麻烦,而且很容易出错,至少我是这样,哭晕在厕所;偶然间想到不是有EF6么,于是在EF6中尝试了下,发现十分简单;只用按照以下步骤,轻松搞定:
我们先建好项目,写好模型,仅用于测试:
public class User
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
public Blog Blog { get; set; }
}
public class Blog
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
public string Content { get; set; }
}
然后在Nuget上面添加EntityFrameWork,注意,如果你是MVC5的项目可以直接添加控制器,然后选择带EF的的视图,系统会帮你添加EF6,如果是MVC4,请手动到Nuget撒很添加EF6
添加完毕,然后建立控制器
点添加,这里会自动帮你生成一些列视图操作(不过咱们不需要,需要的儿时那个Context),然后再context类中添加以下代码
好了,再到配置文件里面添加Mysql的连接字符串,名字就是整个Context类中配置的名字,默认就是contextt类名
好了,好了,这里还需要添加Mysql的conecter,于是我们到Nuget上去添加
运行程序
我们再来查看数据库
接下来我们执行迁移:首先添加一个log类
public class Log
{
public int Id { get; set; }
public string Message { get; set; }
}
这时候如果直接运行会报错,我们需要执行迁移;
好了,在程序管理控制台中输入
Enable-Migrations -EnableAutomaticMigrations
执行成功后会帮你添加
我们再到Context类中添加
重新生成项目之后
然后添加Dbset: public DbSet<Log> Logs { get; set; }
在到程序管理控制台输入 add-migration LogTable,我们看到程序帮我们生成了这个,
其实内容就是对表的一系列操作
最后,再倒1程序管理控制台输入 update-database,
执行后,我们来查看数据库
好了,执行成功,祝你好运(学习中,有什么好的建议欢迎留言:www.seesharply.com)
MVC5+EF6+MYSQl,使用codeFirst的数据迁移
标签: