C# 首先使用匹配现有类创建新表EF代码

C# 首先使用匹配现有类创建新表EF代码,c#,asp.net-mvc,entity-framework,code-first,C#,Asp.net Mvc,Entity Framework,Code First,我有一个具有以下结构的类: public class student { public int Id {get;set;} public string name {get;set;} } 我在创建模型时使用以下配置,根据参数将表列与数据库中的类相匹配,例如, 16岁学生、17岁学生、18岁学生。。。。。所有这些桌子都与学生的班级相匹配 public class studentConfiguration : EntityTypeConfiguration<Models.student&g

我有一个具有以下结构的类:

public class student
{
public int Id {get;set;}
public string name {get;set;}
}
我在创建模型时使用以下配置,根据参数将表列与数据库中的类相匹配,例如, 16岁学生、17岁学生、18岁学生。。。。。所有这些桌子都与学生的班级相匹配

 public class studentConfiguration : EntityTypeConfiguration<Models.student>
        {
            public studentConfiguration (string SchoolId)
            {
                this.ToTable(SchoolId + "_student");
            }

        }
前面的函数可以很好地处理现有的表,但是如何强制EF基于新参数创建新表呢

换句话说,如果我通过参数not exist,我需要创建一个名为55_student的新表

我现在启用了自动迁移,并且在表不存在的情况下成功创建了表,但现在的问题是,当我添加id为56的新学校时,以前的表被删除,因此每次只能添加一个表


是否有任何地方可以防止迁移从调用删除这些表刚刚创建

如果我理解正确,您有一个数据库表,该表的名称由多个变量值组成。在DbContext中也有一个数据库集,您希望告诉entity framework,这个数据库集是在数据库中的一个具有此组合名称的表中建模的

看到类EntityTypeConfiguration的高级用法,我假设您知道这是在函数中完成的

DbContext存在的理由是将实体框架类连接到类使用的实际数据库。建立数据库模型的正确方法是在这个类中

显然,您对“DbContext.OnModelCreating”的重写会创建一个StudentConfiguration对象。此对象将实际配置学生实体

您可能会对数据库的多个实体执行此操作。所有这些配置都需要类似的信息。其中一个是表的名称,另一个可能是某些字符串的最大长度,或小数的精度等

正确的方法是为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的创建者可以完全控制表的命名、某些字符串的最大大小、小数精度、日期时间类型等。如果DbContext的用户不需要此控件,则使用一些默认配置。你甚至可以决定从配置文件中读取此默认配置

你想为每个学生创建一个表吗?不,实际上这是多个学校的一个数据库每个学校都有自己的表我从现有数据库开始,使用EF CodeFirst构建新的应用程序你应该使用每个学校的模式,没有不同的表名。
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
    }
}