![443fa76f8bb0d1820f495dac7332dce6.png](https://i-blog.csdnimg.cn/blog_migrate/056f31357cb9bb92383c7902572bf99d.png)
http://ASP.net core可以跨平台,拥有强大工具与框架。
在ORM方面提供了EF(EntityFramework)的core版本——EF Core,可以用作快速开发。
我们一般会建一个Netcore版本的MVC项目,在选项里支持身份验证。通过包管理器命令行运行迁移命令“Add-Migration 有意义的名称”生成数据库初始化源代码,再通过“Update-Database”命令同步到数据库。(或者系统命令行运行dotnet ef migrations add xxx,dotnet ef database update)
但生成的名字都是驼峰命名法,这也许你不喜欢,或不符合项目规范。
或者你不想要AspNet这样的前缀,为什么我的项目搞得像AspNet项目呢!
于是想改为你自己的命名法,可能你像我一样研究了很多资料,最终已失败告终,总是不得其标准过程。我最终发现了一个救命稻草(见附录)。
MVC只有在首次使用到这些系统表时才会决定他们在什么表里。会在这时调用IdentityDbContext继承类的OnModelCreating方法(你需要重载它)。
我们可以在这是决定表的名字。当然,你的Add-Migration也要在修改了这里后再执行。
下面是部分代码,作用是找到所有相关表,改为下划线命名法/蛇形命名法,并去掉AspNet前缀。ToSnakeCase函数后面提供。
// 遍历所有实体,改它名
foreach (var entity in builder.Model.GetEntityTypes())
{
// 重置所有表名
var snakecase = entity.Relational().TableName.ToSnakeCase();
snakecase = snakecase.Replace("asp_net_", "");
entity.Relational().TableName = snakecase;
}
完整OnModelCreating代码:
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
foreach (var entity in builder.Model.GetEntityTypes())
{
// 重置所有表名
var snakecase = entity.Relational().TableName.ToSnakeCase();
snakecase = snakecase.Replace("asp_net_", "");
entity.Relational().TableName = snakecase;
// 重置所有列名
foreach (var property in entity.GetProperties())
{
property.Relational().ColumnName = property.Relational().ColumnName.ToSnakeCase();
}
// 重置所有主键名
foreach (var key in entity.GetKeys())
{
key.Relational().Name = key.Relational().Name.ToSnakeCase();
}
// 重置所有外键名
foreach (var key in entity.GetForeignKeys())
{
key.Relational().Name = key.Relational().Name.ToSnakeCase();
}
// 重置所有索引名
foreach (var index in entity.GetIndexes())
{
index.Relational().Name = index.Relational().Name.ToSnakeCase();
}
}
}
ToSnakeCase代码:
public static class StringExtensions
{
public static string ToSnakeCase(this string input)
{
if (string.IsNullOrEmpty(input)) { return input; }
var startUnderscores = Regex.Match(input, @"^_+");
return startUnderscores + Regex.Replace(input, @"([a-z0-9])([A-Z])", "$1_$2").ToLower();
}
}
是时候运行迁移命令了,Add-Migration xxx,Update-Database
现在得到了我期望的整齐:
![65dd96be56cb5e251f2e864b0073bc23.png](https://i-blog.csdnimg.cn/blog_migrate/270e9f100bee4524d9b2b061db79773f.jpeg)
__EFMigrationsHistory这个表名我还不知道怎么改,但是对于我来说没有改它的必要,若是你知道了请留言哦!
BTW:我用的MySql数据库+Pomelo的EFCore实现
下面andrewlock适用的数据库是PostgreSQL。
感谢:
Customising ASP.NET Core Identity EF Core naming conventions for PostgreSQLandrewlock.net![5e3c5e9e9ae6828cb11cb63f7585e58d.png](https://i-blog.csdnimg.cn/blog_migrate/f63d16c06b9286a904f755adc89710ce.png)