【问题标题】:OnModelCreating code refactoring from EF6 to EF core 3.1OnModelCreating 代码从 EF6 重构到 EF core 3.1
【发布时间】:2020-08-03 13:10:21
【问题描述】:

我正在尝试重构 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”的定义,并且找不到接受“ModelBuilder”类型的第一个参数的可访问扩展方法“Types”

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

感谢您的帮助

【问题讨论】:

    标签: asp.net-core


    【解决方案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();
           }
       }
      

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

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

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

    【讨论】:

    • 感谢这个解决方案,但我希望在保持相同行为的同时重构代码,我不想遍历每个数据库集实体并这样做
    • 正如错误消息所述,在 EF 核心中,“模型构建器”不包含“类型”的定义。而且,您还可以检查EF core ModelBuilder class 来验证它。因此,您不能在 EF 核心中使用代码(保持相同的行为)。在 EF 核心中,我们必须为每个数据库实体配置实体类型和属性。
    • 那么第二个配置规则呢? modelBuilder.Properties().Configure(c => c.HasColumnName(c.ClrPropertyInfo.Name.ToUpper()));我不能通过那里的每一列来把它变成大写
    • @frod_junior 请检查我在上面的编辑,并尝试使用命名约定插件将表和列名称更改为大写,我已经测试过它,它适用于 SQL服务器数据库,你可以检查一下。
    猜你喜欢
    • 2019-09-15
    • 2016-11-21
    • 2018-08-15
    • 2020-09-09
    • 1970-01-01
    • 2020-06-12
    • 2011-08-03
    • 2018-07-28
    • 1970-01-01
    相关资源
    最近更新 更多