簡體   English   中英

首先使用匹配現有類創建新表EF代碼

[英]Create New Table EF Code First with Match existing class

我有以下結構的類:

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");
            }

        }

先前的功能可以與現有的Tables一起正常工作,但是我如何強制EF基於新參數創建新表

換句話說,如果我傳遞的參數不存在,我需要我說schoolId = 55如果不存在,則應使用名稱55_student創建新表

我現在啟用自動遷移,並且在不存在時成功創建了表,但是現在當我添加ID為56的新學校時,出現了問題,以前的表已刪除,因此我每次只能添加一個表

僅在創建這些表的地方,有什么地方可以防止從調用刪除遷移?

如果我理解正確,則您有一個數據庫表,該表的名稱由多個變量值組成。 您還在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
    }
}

您的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的用戶不需要此控件,則可以使用默認配置。 您甚至可以決定從配置文件中讀取此默認配置

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM