更多

EF Core使用MySQL时数据表存储引擎设置

先上结论,EF Core目前无法为每张表指定存储引擎,无论是通过注解还是Fluent API配置。

但是还是有办法曲线救国的。

修改默认引擎

我们所接触到的MySQL,观察来看都会将MyISAM引擎作为默认存储引擎,但是根据MySQL的官方文档说明,其实自MySQL 5.7开始,默认的引擎就是InnoDB了,推测是我们接触到的MySQL都采用了旧的默认配置文件,导致MySQL自身的默认配置被覆盖。

一般而言,目前使用最多的存储引擎是InnoDB,因为其支持事务、外键等功能。如果你的项目的数据表大部分采用的是InnoDB,那么,只需要修改my.cnfmy.ini配置文件中的default-storage-engine项为InnoDB并重启数据库就可以了。此后当通过Code First新建表时,默认的表存储引擎就会是InnoDB了。

需要注意的是,若采用此种方法修改,则不仅是当前项目的数据库,其他同一数据库服务器中的数据库也会默认采用InnoDB存储引擎,因此推荐大量使用该引擎的或者仅有一个项目的数据库采用该方法。

手动修改迁移文件

此方法适用于采用迁移来管理数据库的项目。我们都知道EF Core的迁移会自动分析新旧模型快照的区别,然后自动生成一个修改数据库的迁移文件,在迁移文件中,通过调用一系列的方法来完成对数据库的修改。此外,在迁移中,还提供了直接编写原始SQL语句的方法,详见:自定义迁移操作 – EF Core | Microsoft Docs

因此,我们可以手动在每个迁移文件中通过编写SQL语句来完成对数据表的调整和改动,调整表引擎的操作可见:MySQL :: MySQL 5.7 Reference Manual :: 15.1 Setting the Storage Engine

下边是一个例子:

C#
public partial class AddBasicOrder : Migration
{
    protected override void Up(MigrationBuilder migrationBuilder)
    {
        //其他操作...
        //...
        migrationBuilder.Sql("ALTER TABLE order ENGINE = InnoDB;");
    }
}

这种方案比较麻烦,以后若有修改变更,很容易忘记同步调整该语句导致问题发生,但是胜在灵活,可以针对具体的表进行配置。

参考

Pomelo中关于此问题的讨论:Ability to specify engine, charset, ROW_FORMAT and more · Issue #84 · PomeloFoundation/Pomelo.EntityFrameworkCore.MySql (github.com)

留下评论

您的邮箱地址不会被公开。 必填项已用 * 标注

Captcha Code