zoukankan      html  css  js  c++  java
  • AspNet Core使用Mysql一些问题及解决方案

    本文假设的你的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版。
    将旧版删除,重新安装此预览版。
    目测暂时可正常运行项目。

  • 相关阅读:
    《应用Yii1.1和PHP5进行敏捷Web开发》学习笔记(转)
    YII 小模块功能
    Netbeans代码配色主题大搜集
    opensuse 启动巨慢 解决方法 90s多
    opensuse 安装 网易云音乐 rpm netease music
    linux qq rpm deb opensuse
    openSUSE 安装 alien
    第一行代码 Android 第2版
    Android Studio AVD 虚拟机 联网 失败
    docker error during connect: Get http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.29/containers/json: open //./pipe/docker_engine: The system cannot find the file specified. In the default daemon configuratio
  • 原文地址:https://www.cnblogs.com/moonblogcore/p/10917248.html
Copyright © 2011-2022 走看看