从EF6到EF core 3.1的OnModelCreating代码重构

时间:2020-08-03 13:10:21

标签: asp.net-core

在尝试将OnModelCreating方法用作ASP.net的一部分之前,我试图对其进行重构::

protected override void OnModelCreating(ModelBuilder modelBuilder)
   {
     base.OnModelCreating(modelBuilder);
     modelBuilder.Types().Configure(c => c.ToTable(c.ClrType.Name.ToUpper()));
     modelBuilder.Properties().Configure(c => c.HasColumnName(c.ClrPropertyInfo.Name.ToUpper()));

....

但是现在迁移到.netCore 3.1之后,我得到了这个错误

'ModelBuilder'不包含'Types'的定义,找不到可以接受的扩展方法'Types'接受类型为'ModelBuilder'的第一个参数

能否请您提出一种在保持相同的旧逻辑的同时正确重构代码的方法

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

根据您的代码,您似乎想要更改表名称并设置列名称,如果是这种情况,则可以尝试引用以下代码来覆盖OnModelCreating方法:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{ 
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    {
        
    }
    public DbSet<Blog> Blogs { get; set; }  

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        //Write Fluent API configurations here

        //Property Configurations 
        modelBuilder.Entity<Blog>().ToTable("BLOGS");
        modelBuilder.Entity<Blog>()
            .Property(b => b.BlogId)
            .HasColumnName("BLOG_ID");

    }
}

更多详细信息,请检查以下链接:

EF Core Fluent API Configuration

Entity Types # Table Name

Column names

How to Specify Entity Framework Core Table Mapping?

修改

第二个配置规则呢? modelBuilder.Properties()。Configure(c => c.HasColumnName(c.ClrPropertyInfo.Name.ToUpper()));我不能经历 在那里的每一列都只是使其大写

有一个开源插件(Naming Conventions)可能会对您有所帮助。通过使用其UseUpperCaseNamingConvention,可以将表和列名称更改为大写。

您可以参考以下步骤来使用它:

  1. 从Nuget中添加EFCore.NamingConventions

  2. 在模型的OnConfiguring方法中启用命名约定:

     public class SchoolContext : DbContext
     {
         public SchoolContext(DbContextOptions<SchoolContext> options) : base(options)
         {
         } 
         public DbSet<Customer> Customers { get; set; }
         protected override void OnModelCreating(ModelBuilder modelBuilder)
         {
             base.OnModelCreating(modelBuilder);
         } 
         protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
         {
             base.OnConfiguring(optionsBuilder);
             optionsBuilder.EnableSensitiveDataLogging();
             optionsBuilder
                 .UseSqlServer("Server=(localdb)\\mssqllocaldb;Database=TestDB;Trusted_Connection=True;MultipleActiveResultSets=true")       //database connection string.
                 .UseUpperCaseNamingConvention();
         }
     }
    

    迁移后,您可以看到“模型快照”,它将更改表和列的名称,如下所示:

    enter image description here

    然后,在更新数据库后,如下表:

    enter image description here

[注意]命名约定是社区维护的插件:它不是Entity Framework Core的正式组成部分,并且不受Microsoft的任何支持。

相关问题