先上结论,EF Core目前无法为每张表指定存储引擎,无论是通过注解还是Fluent API配置。
但是还是有办法曲线救国的。
修改默认引擎
我们所接触到的MySQL,观察来看都会将MyISAM引擎作为默认存储引擎,但是根据MySQL的官方文档说明,其实自MySQL 5.7开始,默认的引擎就是InnoDB了,推测是我们接触到的MySQL都采用了旧的默认配置文件,导致MySQL自身的默认配置被覆盖。
一般而言,目前使用最多的存储引擎是InnoDB,因为其支持事务、外键等功能。如果你的项目的数据表大部分采用的是InnoDB,那么,只需要修改my.cnf或my.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
下边是一个例子:
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)