linq2db中FluentMappingBuilder表名映射未生效的问题求助
解决linq2db中FluentMappingBuilder表名配置不生效的问题
可能遗漏的配置步骤
1. 确保自定义MappingSchema关联到DataContext
linq2db的DataContext默认使用内置的MappingSchema,如果你的自定义SparkleMappingSchema没有传递给DataContext的基类构造函数,Fluent配置根本不会被使用。
检查你的SparkleContext构造函数,必须把自定义MappingSchema传入:
public class SparkleContext : DataContext { public SparkleContext(string connectionString) : base(connectionString, SQLiteTools.GetDataProvider(), new SparkleMappingSchema()) { } // 定义DbSet public ITable<CompanyEm> Companies => GetTable<CompanyEm>(); }
2. 确认FluentMappingBuilder的配置已执行Build()
在自定义MappingSchema的初始化代码中,必须调用FluentMappingBuilder.Build()方法,才能将配置应用到MappingSchema中,这是最容易遗漏的步骤:
public class SparkleMappingSchema : MappingSchema { public SparkleMappingSchema() : base(SQLiteTools.GetDataProvider()) { var builder = new FluentMappingBuilder(this); // 配置实体表名 builder.Entity<CompanyEm>() .HasTableName("Companies"); // 其他实体的Fluent配置... // 必须调用Build()才能生效 builder.Build(); } }
3. 移除实体类上冲突的[Table]特性
如果你的CompanyEm实体类上标注了[Table]特性(比如[Table("CompanyEm")]),linq2db会优先使用特性配置的表名,覆盖Fluent配置。请移除该特性,或者确保特性中的表名与Fluent配置一致。
4. 避免DbSet定义时手动指定表名
如果在DataContext中定义ITable时手动指定了表名(比如GetTable<CompanyEm>("CompanyEm")),这个手动指定的名称会覆盖MappingSchema中的配置。正确的写法是直接使用泛型方法:
// 正确写法 public ITable<CompanyEm> Companies => GetTable<CompanyEm>(); // 错误写法(会覆盖Fluent配置) // public ITable<CompanyEm> Companies => GetTable<CompanyEm>("CompanyEm");
5. 确保MappingSchema实例的正确性
如果你的MappingSchema被重复创建且初始化逻辑有误,或者使用了错误的实例,也会导致配置不生效。推荐将MappingSchema做成单例,避免重复初始化:
public static class MappingSchemaSingleton { public static readonly MappingSchema Instance = new SparkleMappingSchema(); } // 在DataContext中使用单例 public SparkleContext(string connectionString) : base(connectionString, SQLiteTools.GetDataProvider(), MappingSchemaSingleton.Instance) { }
内容的提问来源于stack exchange,提问作者Overcode
相关产品推荐
相关产品推荐

