实体框架迁移:获取表和列的名称

时间:2018-09-24 14:27:10

标签: c# entity-framework ef-migrations

DbContext.OnModelCreating中,您得到一个DbModelBuilder对象。您告诉该对象DbSets的表/列的名称以及表之间的关系。

例如,如果您有一个类Country,并且想为表命名为Countries(而不是默认的Countrys,则应编写:

modelBuilder.Entity<Country>().ToTable("Countries");

稍后,将数据库迁移到较新版本时,将调用方法DbMigration.Up()

假设我想添加一个列有国家缩写名称的列(例如“ UK”代表“ United Kingdom”)

public override void Up()
{
     this.AddColumn(..., // name of table
        "Abbreviation",
        column => column.String(nullable: true, maxLength: 10));
}

我知道在我的DbContext中某个地方存储了连接到我的DbSet<Country>的表的实际名称。毕竟,每当我保存对DbSet<Country>所做的更改时,DbContext都会知道要更改的表的名称。

因此,要获取表的名称,我想我必须询问DbMigration它正在迁移哪个DbContext,但我找不到它。即使我拥有DbContext,也无法要求其提供其模型。我以为这应该在属性DbContext.Configuration中,但是返回的DbContextConfiguration没有字段可以访问表和列的名称,就像ModelBuilder一样。

因此:如何知道我在此DbMigration中更新的版本中的表和列的实际名称?

在评论后添加

Steve Green建议让Entity Framework DbMigration检测到模型已更改。对于有兴趣的人,此方法称为Automated Migration

但是,如果要完全控制表/列以及表之间的关系,则需要进行code-based migrations(使用DbMigrations.Up()和DbMigrations.Down()的迁移。) >

如果在创建代码优先数据库的过程中,您不希望表和列的默认命名约定,如果您不希望默认的字符串长度,小数的默认精度等,则必须使用流利的API(或属性)。

类似地,如果您不希望在迁移过程中默认使用实体框架,则必须使用DbMigrations.Up()Down()编写代码。

为简化示例,我使用了类Country,该类默认情况下会导致表Countrys的出现。但是,人们可能会想到更复杂的项目,例如字符串属性的最大字段长度,CascadeOnDelete

的小数精度

0 个答案:

没有答案