EF Code First指定自定义架构同时保留默认表命名规则的方法
刚好碰到过类似的需求,给你几个实用的解决方案,既能指定Data架构,又不用手动写每个表的名字,完全保留EF的默认命名规则:
方法1:Fluent API全局配置(最省心)
不用给每个实体加Table特性,直接在DbContext的OnModelCreating方法里统一设置所有实体的架构,EF会自动沿用默认的表名规则(比如类名或者复数类名,取决于你的EF配置):
protected override void OnModelCreating(DbModelBuilder modelBuilder) { // 为所有实体设置Data架构,保留EF默认表名 modelBuilder.Types().Configure(entity => entity.ToTable(entity.ClrType.Name, "Data")); // 如果你开启了EF默认的复数化表名(默认是开启的),可以用下面的代码获取复数表名 // var pluralizer = new System.Data.Entity.Infrastructure.Pluralization.EnglishPluralizationService(); // modelBuilder.Types().Configure(entity => // entity.ToTable(pluralizer.Pluralize(entity.ClrType.Name), "Data")); }
这种方式一劳永逸,所有实体都会自动套用Data架构,表名完全遵循EF的默认逻辑,不用逐个实体配置。
方法2:自定义EF约定(更贴合约定优先理念)
如果你想完全遵循EF的约定式配置思路,可以创建一个自定义约定,自动给所有实体加上Data架构,不改动默认表名:
// 自定义约定类 public class DataSchemaConvention : IStoreModelConvention<EntityType> { public void Apply(EntityType item, DbModel model) { // 只修改架构,保留EF自动生成的表名 item.Schema = "Data"; } } // 在DbContext中注册这个约定 protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Conventions.Add(new DataSchemaConvention()); }
这个方法的优势是完全融入EF的配置体系,不管你有没有开启复数化、有没有其他表名约定,都会自动沿用EF原本的表名生成逻辑,只是统一替换架构为Data。
方法3:自定义特性(适用于部分实体需要指定架构的场景)
如果只有部分实体需要用Data架构,其他实体用默认架构,可以自定义一个特性,通过约定来识别并设置架构:
// 自定义特性 [AttributeUsage(AttributeTargets.Class)] public class DataSchemaTableAttribute : Attribute { } // 处理该特性的约定 public class DataSchemaTableConvention : IStoreModelConvention<EntityType> { public void Apply(EntityType item, DbModel model) { var attr = item.ClrType.GetCustomAttribute<DataSchemaTableAttribute>(); if (attr != null) { // 给标记了特性的实体设置Data架构,保留默认表名 item.Schema = "Data"; } } } // 在DbContext注册约定 protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Conventions.Add(new DataSchemaTableConvention()); } // 使用时给实体加特性即可 [DataSchemaTable] public class Customer { public int Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } }
这种方式灵活度高,适合需要差异化配置架构的场景。
内容的提问来源于stack exchange,提问作者dey.shin
相关产品推荐
相关产品推荐

