c# - 实体框架迁移:获取表和列的名称
问题描述
在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
解决方案
推荐阅读
- visual-studio - Visual Studio,设置 2 个启动项目,一个 docker 和一个客户端
- python - 在二维数组列中查找重复值
- reactjs - 在 redux 中使用 break 语句在 reactJS 中没有得到实际输出
- html - Power BI 中带有 R 脚本的 read_html 错误
- azure - 如何使用表单识别器在 PDF 文件中查找页眉和页脚
- reactjs - 反应三纤维 attachArray 坏了
- ios - IPA 文件上传失败:密码必须有非空值错误
- android - RecyclerView android中的Admob原生广告
- mongodb - MongoDb SpringBoot 更新 currentUser
- python - 如何使用 Python 证明一个根式表达式是三次多项式的根