在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