使用元数据动态配置模型
动态配置表名(默认复数)
//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); }