我有以下结构的类:
public class student
{
public int Id {get;set;}
public string name {get;set;}
}
我在模型创建时使用以下配置,根据参数将表列与数据库中的类匹配,例如我有, 16_student,17_student,18_student .....所有这些表都与学生班级相匹配
public class studentConfiguration : EntityTypeConfiguration<Models.student>
{
public studentConfiguration (string SchoolId)
{
this.ToTable(SchoolId + "_student");
}
}
上一个函数可以正常使用现有的表,但我如何强制EF基于新参数创建新表
在我需要的另一个单词中,如果我传递的参数不存在,请说如果不存在,应该创建名为55_student的schoolId = 55新表
我现在启用自动迁移,并且表格在不存在时成功创建,但现在当我添加ID为56的新学校时,问题已删除,因此我每次只能添加一个表
是否有任何地方可以阻止从这些表的调用删除迁移只是创建?
答案 0 :(得分:1)
如果我理解正确,你有一个数据库表,其表的名称由几个变量值组成。你也在你的DbContext中有一个DbSet<TEntity>
,你想告诉实体框架这个DbSet
是在你的数据库中用这个组合名称的表建模的。
查看类EntityTypeConfiguration
的高级用法我假设您知道这是在函数DbContext.OnModelCreating中完成的
DbContext的存在理由是将您的实体框架类连接到您的类使用的实际数据库。建模数据库的正确方法是在这个类中。
显然,您对'DbContext.OnModelCreating'的覆盖会创建一个StudentConfiguration
对象。此对象将执行Student
实体的实际配置。
您可能会为数据库的多个实体执行此操作。所有这些配置都需要类似的信息。其中一个是表的名称,其他可能是某些字符串的最大长度,或小数的精度等。
执行此操作的正确方法是为StudentConfiguration
提供包含此信息的对象(o界面)。整个想法类似于工厂设计模式:
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的创建者可以完全控制表的命名,某些字符串的最大大小,小数的精度,DateTime的类型等。如果你的DbContext的用户不需要这个控制,使用一些默认配置。您甚至可以决定从配置文件中读取此默认配置