时间:2021-07-01 10:21:17 帮助过:2人阅读
很显然这是默认的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开发脱坑指南
标签: