首页 > 解决方案 > 实体框架迁移:获取表和列的名称

问题描述

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

例如,如果你有一个 class 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,我也不能要求它提供模型。我认为这将在 property 中DbContext.Configuration,但返回DbContextConfiguration的没有字段来访问表和列的名称,就像ModelBuilder有。

那么:我如何知道我正在更新的版本中的表和列的实际名称DbMigration

评论后补充

Steve Green 提议让 Entity Framework DbMigration 检测到模型发生了变化。对于那些感兴趣的人,这种方法称为自动迁移

但是,如果您想要完全控制表/列以及表之间的关系,则需要进行基于代码的迁移(使用 DbMigrations.Up() 和 DbMigrations.Down() 进行迁移。

如果在创建代码优先数据库期间您不想要表和列的默认命名约定,如果您不想要默认字符串长度、小数的默认精度等,则必须使用 fluent API (或属性)。

同样,如果您不希望在迁移期间实体框架默认设置,则必须在DbMigrations.Up()和中编写代码Down()

为了使我的示例简单,我使用Country了默认情况下会导致 table 的类Countrys。但是可以考虑更复杂的项目,例如字符串属性的最大字段长度、小数的精度、CascadeOnDelete

标签: c#entity-frameworkentity-framework-migrations

解决方案


推荐阅读