zoukankan      html  css  js  c++  java
  • 【EFCORE笔记】动态模型配置

    使用元数据动态配置模型

    动态配置表名(默认复数)

    //This will singularize all table names
    foreach (IMutableEntityType entityType in modelBuilder.Model.GetEntityTypes())
    {
            entityType.Relational().TableName = entityType.DisplayName();
    }
    

      

    动态修改表配置

    foreach (IMutableEntityType entityType in modelBuilder.Model.GetEntityTypes())
    {
            modelBuilder.Entity(entityType.Name).ToTable($"T_{ entityType.DisplayName()}");
    }
    

      

    动态修改列配置

    foreach (IMutableEntityType entityType in modelBuilder.Model.GetEntityTypes())
    {
            foreach (IMutableProperty property in entityType.GetProperties()
    .Where(p => p.ClrType == typeof(string)))
            {
                    property.SetMaxLength(20);
            }
    }
    
    foreach (IMutableEntityType entityType in modelBuilder.Model.GetEntityTypes())
    {
            foreach (IMutableProperty property in entityType.GetProperties()
    .Where(p => p.ClrType == typeof(string)))
            {
                    modelBuilder.Entity(entityType.Name)
    .Property(property.Name)
    .HasColumnName($"C_{pr operty.Name}");
            }
    }
    

      

    配置上下文

    virtual void  OnConfiguring(DbContextOptionsBuilder optionsBuilder);
    
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
            if (!optionsBuilder.IsConfigured)
            {
    
                    optionsBuilder.UseSqlServer("connectionString");
            }
    
            base.OnConfiguring(optionsBuilder);
    }
    

      

    配置模型

    virtual void  OnModelCreating(ModelBuilder modelBuilder); 
    
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
            modelBuilder.Entity<Blog>()
    .Property(b => b.Url)
    .HasColumnName("BlogUrl");
    
            base.OnModelCreating(modelBuilder);
    }
    

      

    最常规最简单的写法

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
            modelBuilder.Entity<Blog>()
    .Property(b => b.Url)
    .HasColumnName("BlogUrl");
            modelBuilder.Entity<Blog>()
    .Property(b => b.Name).HasMaxLength(50);
    
            modelBuilder.Entity<Post>()
    .Property(b => b.Title)
    .HasMaxLength(30);
            modelBuilder.Entity<Post>()
    .Property(b => b.Content)
    .HasMaxLength(500);
    
            base.OnModelCreating(modelBuilder);
    }
    

      

    使用表达式分离配置的写法

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
            modelBuilder.Entity<Blog>(buildAction =>
            {
                    buildAction.Property(b => b.Url)
    .HasColumnName("BlogUrl");
                    buildAction.Property(b => b.Name)
    .HasMaxLength(50);
            });
    
            modelBuilder.Entity<Post>(buildAction =>
            {
                    buildAction.Property(b => b.Title)
    .HasMaxLength(30);
                    buildAction.Property(b => b.Content)
    .HasMaxLength(500);
            });
    
            base.OnModelCreating(modelBuilder);
    }
    

      

    使用方法分离配置的写法

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
            modelBuilder.Entity<Blog>(ConfigureBlog);
    
            modelBuilder.Entity<Post>(ConfigurePost);
    
            base.OnModelCreating(modelBuilder);
    }
    
    private void ConfigureBlog(EntityTypeBuilder<Blog> buildAction)
    {
            buildAction.Property(b => b.Url).HasColumnName("BlogUrl");
    
            buildAction.Property(b => b.Name).HasMaxLength(50);
    }
    
    private void ConfigurePost(EntityTypeBuilder<Post> buildAction)
    {
            buildAction.Property(b => b.Title).HasMaxLength(30);
    
            buildAction.Property(b => b.Content).HasMaxLength(500);
    }
    

      

    使用类分离配置的写法

    public class BlogConfiguration : IEntityTypeConfiguration<Blog>
    {
            public void Configure(EntityTypeBuilder<Blog> builder)
            {
                    builder.Property(b => b.Url).HasColumnName("BlogUrl");
                    builder.Property(b => b.Name).HasMaxLength(50);
            }
    }
    
    public class PostConfiguration : IEntityTypeConfiguration<Post>
    {
            public void Configure(EntityTypeBuilder<Post> builder)
            {
                    builder.Property(b => b.Title).HasMaxLength(30);
    
                    builder.Property(b => b.Content).HasMaxLength(500);
            }
    }
    
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
            modelBuilder.ApplyConfiguration(new BlogConfiguration());
    
            modelBuilder.ApplyConfiguration(new PostConfiguration());
    
            base.OnModelCreating(modelBuilder);
    }
    
    
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
            modelBuilder
    .ApplyConfigurationsFromAssembly(Assembly.GetExecutingAssembly());
    
            base.OnModelCreating(modelBuilder);
    }
    

      

    重写DbContext 相关的方法

    DbContext 提供了诸多的虚方法,可在子类中直接复写对应的方法,在方法执行前后自定义操作。

    public override int SaveChanges()
    {
            //TODO
            return base.SaveChanges();
    }
    
    public override EntityEntry Remove(object entity)
    {
            //TODO
            return base.Remove(entity);
    }
    

      

  • 相关阅读:
    JavasScript 实现二分法快排注意点
    JS的面向对象二(通过构造函数的方式)
    JS的面向对象一(通过构造函数的方式)
    leetcode.977_有序数组的平方
    leetcode_38.报数
    leetcode_20.c++有效的括号
    leetcode_21.c++合并两个有序列表
    leetcode_最长公共前缀
    T2_两数相加
    T1_两数之和
  • 原文地址:https://www.cnblogs.com/lbonet/p/14608835.html
Copyright © 2011-2022 走看看