使用Match现有类创建新表EF代码

时间:2017-08-22 05:57:39

标签: c# asp.net-mvc entity-framework code-first

我有以下结构的类:

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的新学校时,问题已删除,因此我每次只能添加一个表

是否有任何地方可以阻止从这些表的调用删除迁移只是创建?

1 个答案:

答案 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
    }
}

DbContextOnModelCreating

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的用户不需要这个控制,使用一些默认配置。您甚至可以决定从配置文件中读取此默认配置