【问题标题】:Create New Table EF Code First with Match existing class首先使用匹配现有类创建新表 EF 代码
【发布时间】:2017-08-22 05:57:38
【问题描述】:

我有以下结构的课程:

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 根据新参数创建新表

换句话说,如果我传递的参数不存在,我需要假设 schoolId = 55 如果不存在,则应该使用名称 55_student 创建新表

我现在启用自动迁移,当它不存在时成功创建了表,但现在当我添加 id 为 56 的新学校时,以前的表已删除,所以我每次只能添加一个表

有什么地方可以防止迁移从这些表的调用删除只是创建?

【问题讨论】:

  • 您想为每个学生创建一个表格?
  • 不,实际上这是多所学校的一个数据库,每所学校都有自己的表,我从现有数据库开始,并使用 EF codefirst 构建新应用程序
  • 你应该为每个学校使用一个模式,而不是不同的表名。

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


【解决方案1】:

如果我理解正确,您有一个数据库表,其中一个表的名称由多个变量值组成。您还在 DbContext 中有一个 DbSet&lt;TEntity&gt;,并且您想告诉实体框架此 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
    }
}

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

【讨论】:

    猜你喜欢
    • 2016-06-06
    • 1970-01-01
    • 2012-01-10
    • 1970-01-01
    • 1970-01-01
    • 2018-09-18
    • 1970-01-01
    • 2013-10-11
    • 1970-01-01
    相关资源
    最近更新 更多