MVC的EF框架使用MySQL数据库踩坑

首先,SqlServer才是微软的亲儿子,除非必须要用MySQL,自己耍一下的话还是用亲儿子。

第一坑 准备

mysql-for-visualstudio-1.2.8

mysql-connector-net-6.10.8

在MySQL官网可以下载到

VS项目里安装NuGet包

MySQL.Data和MySQL.Data.Entity(一定要保证和mysql-connector-net版本一致)

笔者此时,MySQL.Data最新版是8.0.13,但MySQL.Data.Entity仍是6.10.8,所以统一安装6.10.8

第二坑 字段

MySQL的连接字符串要写对

eg: 

第三坑  未能加载文件或程序集“mysql.data”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。

仔细观察web.config中,


   
   

要把newVersion修改为你当前版本

第四坑 Specified key was too long; max key length is 765 bytes

这是EF的Code First模式,转换为MySQL表的坑,运行后查看自己数据库生成的表,你会发现原本应是string类型的字符怎么是longtext,没错,这就是一个坑。string类型直接映射到MySql中是longtext,而MySql支持最大长度为767bytes,我们可以用DataAnnotations方式备注字符串,这样MySQL里就是varchar(100)。

    public class Author
    {
        public int Id { get; set; }
        [MaxLength(100)]
        public string FirstName { get; set; }
        [MaxLength(100)]
        public string LastName { get; set; }
        [MaxLength(100)]
        public string Biography { get; set; }
        public virtual ICollection Books { get; set; }
    }

同时,还要修改上下文配置,其默认的是MSSqlServer,生成的_MigrationHistory表也有string类型,所以我们还要在yourProjectContext类上通过特性标记上下文使用MySql的配置。

  [DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))]
    public class BookContext : DbContext
    {
        public BookContext():base("BookContext")
        {

        }
        public DbSet Books { get; set; }
        public DbSet Authors { get; set; }
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove();
            base.OnModelCreating(modelBuilder);
        }
    }

最后,闲着没事,用ef还是SQLserver吧

你可能感兴趣的:(.net)