Code-First多项目共用库:迁移时仅创建不存在的Categories表
解决Code-First共用数据库时仅在表不存在时创建Categories表的问题
针对两个Code-First项目共用同一数据库的场景,要实现仅在Categories表不存在时才执行创建逻辑,你需要修改生成的迁移类,添加表存在性的条件判断,具体步骤如下:
修改迁移类的Up方法
将EF自动生成的CreateTable和CreateIndex代码替换为带条件判断的原生SQL执行逻辑(以SqlServer为例):
public partial class init : Migration { protected override void Up(MigrationBuilder migrationBuilder) { // 仅当Categories表不存在时才执行创建操作 migrationBuilder.Sql(@" IF NOT EXISTS(SELECT * FROM sys.tables WHERE name = 'Categories' AND schema_id = SCHEMA_ID('dbo')) BEGIN CREATE TABLE [dbo].[Categories] ( [Id] bigint NOT NULL IDENTITY(1,1), [Name] nvarchar(max) NOT NULL, [ParentCategoryId] bigint NULL, CONSTRAINT [PK_Categories] PRIMARY KEY CLUSTERED ([Id] ASC), CONSTRAINT [FK_Categories_Categories_ParentCategoryId] FOREIGN KEY ([ParentCategoryId]) REFERENCES [dbo].[Categories] ([Id]) ); CREATE NONCLUSTERED INDEX [IX_Categories_ParentCategoryId] ON [dbo].[Categories] ([ParentCategoryId]); END "); } protected override void Down(MigrationBuilder migrationBuilder) { // 若需要回滚,可保留原有的DropIndex和DropTable逻辑,或根据需求添加条件判断 migrationBuilder.DropIndex( name: "IX_Categories_ParentCategoryId", table: "Categories"); migrationBuilder.DropTable( name: "Categories"); } }
关键说明
- 利用SqlServer系统视图
sys.tables检查表是否存在,通过SCHEMA_ID('dbo')指定默认架构,确保判断的准确性 - 将创建表、主键、外键及索引的逻辑全部包裹在
IF NOT EXISTS代码块内,避免重复创建导致的数据库报错 - 若使用其他数据库(如MySQL),需替换表存在性判断的SQL:
-- MySQL版本的判断语句 IF NOT EXISTS (SELECT * FROM information_schema.tables WHERE table_schema = DATABASE() AND table_name = 'Categories')
内容的提问来源于stack exchange,提问作者nnmmss
相关产品推荐
相关产品推荐

