.net mvc 身份验证_MVC+EF入门必修课——系统表改名

443fa76f8bb0d1820f495dac7332dce6.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

__EFMigrationsHistory这个表名我还不知道怎么改,但是对于我来说没有改它的必要,若是你知道了请留言哦!

BTW:我用的MySql数据库+Pomelo的EFCore实现

下面andrewlock适用的数据库是PostgreSQL。

感谢:

Customising ASP.NET Core Identity EF Core naming conventions for PostgreSQL​andrewlock.net
5e3c5e9e9ae6828cb11cb63f7585e58d.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值