如果我理解正确,您有一个数据库表,其中一个表的名称由多个变量值组成。您还在 DbContext 中有一个 DbSet<TEntity>,并且您想告诉实体框架此 DbSet 是在您的数据库中建模的具有此组合名称的表中。
看到你对EntityTypeConfiguration类的高级用法我假设你知道这是在函数DbContext.OnModelCreating中完成的
DbContext 存在的理由是将您的实体框架类连接到您的类使用的实际数据库。为您的数据库建模的正确方法是在此类中。
显然,您对“DbContext.OnModelCreating”的覆盖会创建一个StudentConfiguration 对象。此对象将执行Student 实体的实际配置。
您可能会对数据库的多个实体执行此操作。所有这些配置都需要类似的信息。其中之一是表的名称,其他可能是某些字符串的最大长度,或者小数的精度等。
执行此操作的正确方法是为您的StudentConfiguration 提供一个包含此信息的对象(或接口)。整个思路类似于工厂设计模式:
interface ISchoolRequirements
{
public string StudentTableName {get;}
... // other items that differ per school
}
class MySchoolRequirements : ISchooRequirements
{
... // properties needed to create a StudentTableName
// the function that composes the StudentTableName from the properties
private string CreateStudentTableName() {...}
// implementation of ISchoolRequirements
public string StudentTableName {get{return this.CreateStudentTableName(); }
}
public class studentConfiguration : EntityTypeConfiguration<Models.student>
{
public studentConfiguration (ISchoolRequirement schoolRequirements)
{
this.ToTable(schoolRequirements.StudentTableName);
... // other configuration items
}
}
你的DbContext 和OnModelCreating:
class MyDbContext : DbContext
{
ISchoolRequirements SchoolRequirements {get; set;}
public DbSet<Student> Students {get; set;}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// if no school requirements set, use default school requirements:
ISchoolRequirements schoolRequirement = this.SchoolRequirements ??
CreateDefaultSchoolRequirements();
// create the configurations:
modelBuilder.Configurations.Add(new StudentConfiguration(schoolRequirements));
modelBuilder.Configurations.Add(new TeacherConfiguration(schoolRequirements));
modelBuilder.Configurations.Add(new ClassRoomConfigurations(schoolRequirments));
... // etc
}
}
优点是您的 DbContext 的创建者可以完全控制表的命名、某些字符串的最大大小、小数的精度、日期时间的类型等。如果您的 DbContext 的用户不需要这个控制,使用一些默认配置。您甚至可以决定从配置文件中读取此默认配置