EF6:如何在InitialCreate前创建数据库架构?
解决方案
1. 修正实体类的架构配置
别用[Table("schema.TableName")]这种错误写法,这会让EF把整个字符串当成表名,而非指定架构下的表。改成以下两种正确方式:
- DataAnnotation 方式:
[Table("TableName", Schema = "SCHEMA")] public class YourEntity { // 实体属性定义 } - Fluent API 方式(推荐):
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<YourEntity>() .ToTable("TableName", "SCHEMA"); }
2. 创建并执行架构迁移
- 运行命令生成第一个迁移:
Add-Migration CreateSchema - 编辑生成的迁移类,替换
Up和Down方法为架构创建/删除的SQL:public partial class CreateSchema : Migration { protected override void Up(MigrationBuilder migrationBuilder) { // 创建大写的SCHEMA架构 migrationBuilder.Sql("CREATE SCHEMA SCHEMA;"); } protected override void Down(MigrationBuilder migrationBuilder) { // 注意:若架构下有表,需先删除表再删架构 migrationBuilder.Sql("DROP SCHEMA SCHEMA;"); } } - 执行迁移将架构同步到数据库:
Update-Database
3. 生成表的初始迁移
现在运行命令创建表的迁移:
Add-Migration InitialCreate -Verbose
EF会正确识别到需要在SCHEMA架构下创建表,生成完整的建表迁移代码,不会出现空迁移的情况。
为什么之前的操作会生成空迁移?
- 错误的
[Table]属性写法让EF无法识别架构与表的关联,误以为没有新表需要创建。 - 使用
-IgnoreChanges参数时,EF会生成一个标记「当前模型与数据库已同步」的迁移,后续修改模型时,对比迁移快照会判定无变化,从而生成空迁移。
内容的提问来源于stack exchange,提问作者vilem cech
相关产品推荐
相关产品推荐

