使用Ef Core,能否同时维护数据库表架构和实现花里胡哨功能?
摘要:Ef Core花里胡哨系列(7) 使用Ef Core也能维护表架构? 我们这里指的并不是查询,而是利用Ef的迁移原理,生成可用的其它表架构操作的Sql。 例如你想在Ef Core里建表,并且可能程序里有多个provider,那么写Sql将是
Ef Core花里胡哨系列(7) 使用Ef Core也能维护表架构?
我们这里指的并不是查询,而是利用Ef的迁移原理,生成可用的其它表架构操作的Sql。
例如你想在Ef Core里建表,并且可能程序里有多个provider,那么写Sql将是一件痛苦的事情,我们就是利用Ef Core迁移时的操作,来为我们所用。
如果看过此系列中屏蔽外键的那一篇博客,我们的主角就暗藏在里面,它就是各种Operation。
Operation
Ef Core中所有的迁移的工作单元均由Operation组成,例如CreateTableOperation、AlterColumnOperation等等,我们要做的就是将我们的操作组装为对应的Operation来模拟迁移的操作,让Ef Core去生成Sql,那我们在一定程度上就避免了Sql的强耦合,生成Sql将有Ef Core的提供程序来提供支持。
当然我们之前提到过,不同的提供程序可能有些实现是没有的,例如微软官方就不提供AlterColumnOperation,直接采用的暴力的Drop和Add,我们只需重写IMigrationsSqlGenerator中对应的实现即可。
使用Operation有两种方法实现:
直接拼接Operation
类似于迁移文件的写法
直接拼接Operation
直接拼接Operation需要我们创建对应的Operation并且填充里面的主要信息,生成Sql时,需要拿到DbContext内部的IMigrationsSqlGenerator作为服务,用于生成Sql。
var service = CreateDbContext<DataDbContext>().GetService<IMigrationsSqlGenerator>();
var creator = new CreateTableOperation()
{
Name = "test",
};
creator.Columns.Add(new AddColumnOperation()
{
Name = "Id",
ClrType = typeof(int),
IsNullable = false
});
var operations = new List<MigrationOperation> {
creator
};
var cmd = service.Generate(operations);
foreach (var item in cmd.Select(x => x.CommandText))
{
TestOutputHelper.WriteLine(item);
}
类似于迁移文件的写法
类似于迁移文件的写法实现时,和迁移文件中展现的部分基本一样,生成Sql时,需要构建一个MigrationBuilder并且提供你要使用的Ef Core提供程序,项目里需要引用该提供程序。随后即可生成对应的Sql。
