由于不是自家的,MySQL和SQL Server比起来要多做很多配置。下面总结了一些,如果有没涉及到的地方,欢迎补充。
1、添加MySql.Data、MySql.Data.Entity的引用。
2、如果没有自动配置,则在Config中给connectionStrings配置:providerName="MySql.Data.MySqlClient"。
3、在Code First模式下,自动创建仅在无数据库的时候触发,和正常的一样会创建库、migration表、model表,但没法自动更新单独的改动。
4、须要给你的DbContext加上Attribute:[DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))]
5、实施乐观锁的Timestamp字段(SQL Server中叫RowVersion)。
5.1、需要在MySql数据库中配置Timestamp字段默认值为CURRENT_TIMESTAMP。并且注意默认的精度只到秒,需要配置Timestamp(3)来精确到毫秒,只有MySql5.6.4以后的版本支持这样的精度,最多6位精度。
5.2、对应EF实体类中,使用DateTime类型属性。(SQL Server中使用byte[]类型)。
5.3、对应EF实体类的Config中配置Property(x=>x.rowver).IsConcurrencyToken(),申明是并发控制属性;对应EF实体类的Config中配置Property(x=>x.rowver).HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity),申明由数据库自行更新;由于破坏了“约定”,须对Id列手动配置Property(x=>x.Id).HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity),使其继续作为主键,由数据库自行更新。(SQL Server中只要Property(x=>x.rowver).IsRowVersion()就好了,吐血)
6、一个调优细节,如果是由纯数字组成的字符串类型的字段,比如电话号码,对应EF实体类的Config中可以配置Property(x => x.PhoneNum).IsUnicode(false),来减少存储容量的占用,可是这招对MySql没有效果,因为这招利用的是Sql Server的字符串分为varchar和nvarchar,而MySql是不区分的。