Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 532|回复: 0

AspNet Core使用Mysql一些问题及解决方案

[复制链接]
  • TA的每日心情
    奋斗
    2024-4-6 11:05
  • 签到天数: 748 天

    [LV.9]以坛为家II

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    705612
    发表于 2021-4-11 12:34:28 | 显示全部楼层 |阅读模式

    本文假设的你的AspNet Core 2.2的Web程序通过EntityFrameworkCore连接使用MSSQL数据库,能正常使用。

    如何想转为使用Mysql,其实不难。

    1、安装Mysql
    这个简单,从官网https://www.mysql.com/downloads/可以直接下载,无需注册网站。个人使用只需要Community社区版即可。
    如果下载的是zip压缩版,解压到相应位置。添加my.ini到mysql安装目标,网上可以很容易搜索找到。
    命令行模式进入安装目录下的bin内:
    (1)运行mysqld --initialize --console,记住显示的root的初始化密码。
    (2)安装windows的mysql服务:mysqld --install [服务名]
    (3)运行net start mysql启动服务。
    (4)运行mysql -u root -p,输入初始化密码登录。
    (5)正常进入mysql后,运行ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码'; 修改密码。
    (6)几条常用命令:show databases;显示数据库//use 数据库名;设置当前数据库//show tables;显示当前数据库的表。//drop database 数据库;删除数据库。

    2.修改数据库连接
    编辑web项目下的appsetings.json文件,修改或添加:

    "ConnectionStrings": {
        "MysqlConnection": "Data Source=localhost;Database=数据库名;User 
            ID=root;Password=密码;pooling=true;CharSet=utf8;port=3306;sslmode=none"
    },
    

      

    3.添加程序包
    web项目右击运行"管理NuGet程序包...",浏览添加Pomelo.EntityFrameworkCore.MySql。(如果添加官方的Mysql.Data.EntityFrameworkCore,之后出现会一些问题)。

    4.编辑配置Mysql服务
    编辑web项目下的Startup.cs文件,在ConfigureServices方法中,将原来的UserSqlServer服务项注释掉,添加

    services.AddDbContext<ApplicationDbContext>(options =>
            options.UseMySql(
                    Configuration.GetConnectionString("MysqlConnection")));
    

    其中ApplicationDbContext替换为你的数据库上下文,MysqlConnection为第2步设置的连接串名。

    (使用官方Mysql.Data.EntityFrameworkCore时,上面内容为options.UseMySQL)

    5.运行程序
    如果你配置了Code First,现在运行程序应该可以自动创建数据库和导入数据。

    6.几个问题
    如果你的Web使用了官方个人用户标识Identity,直接使用Mysql可能会出现一些问题。

    (1)ERROR 1071 (42000): Specified key was too long; max key length is 3072 bytes)。
    原因是个人用户标识Identity一些表使用复合字段索引,而这些字段是字符型,这样容易造成mysql主键索引超长问题。
    解决办法:先删除数据库和之前的迁移目录(注意备份),编辑数据上下文类所在类,添加

    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);
    
        // UserLogins用户登录表最大字长限制(否则mysql中出现索引超出长度限制3073字节问题)
        builder.Entity<IdentityUserLogin<string>>(b =>
        {
            b.HasKey(t => new { t.LoginProvider, t.ProviderKey });
            b.Property(u => u.LoginProvider).HasMaxLength(128);
            b.Property(u => u.ProviderKey).HasMaxLength(128);
            b.ToTable("AspNetUserLogins");
        });
    
        builder.Entity<IdentityUserToken<string>>(b =>
        {
            b.Property(t => t.LoginProvider).HasMaxLength(128);
            b.Property(t => t.Name).HasMaxLength(128);
            b.HasKey(t => new { t.UserId, t.LoginProvider, t.Name });
            b.ToTable("AspNetUserTokens");
        });
    
        builder.Entity<IdentityUserRole<string>>(b =>
        {
            b.Property(t => t.UserId).HasMaxLength(128);
            b.Property(t => t.RoleId).HasMaxLength(128);
            b.HasKey(r => new { r.UserId, r.RoleId });
            b.ToTable("AspnetUserRoles");
        });
    }
    

      

     

    以上三个表都使用复合字段索引,所以添加了最大字段长度,这样就可以避免这个问题了。
    可以通过程序包管理控制台运行Add-Migration InitData和Update-Database看看能否正常迁移数据库。

    (2)如何你现在使用3.0以上版本Netcore,继续使用2.2.x版的Pomelo.EntityFrameworkCore.MySql会出现各种运行错误(2019.11.4新增)
    请重新运行NuGet,并将包含预览版检测框加上勾,因为目前Pomelo.EntityFrameworkCore.MySql的最新版只有3.0.0-rc1.final版。
    将旧版删除,重新安装此预览版。
    目测暂时可正常运行项目。

     

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-18 17:53 , Processed in 0.063792 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表