3

当我使用数据库初始值设定项(如DropCreateDatabaseAlwaysMigrateDatabaseToLatestVersion)来创建实体框架(5.0.0)数据库时,生成的模式不包括我在迁移中定义的索引,这与我使用Update-Database创建数据库时不同。为什么实体框架会丢失我的索引?

如何配置系统,使其使用数据库初始化程序产生与按顺序运行迁移时相同的最终结果?

实施例迁移

public override void Up() 
{ 
    CreateIndex("dbo.Users", "Username", unique:true); 
} 

结果从DropCreateDatabaseAlways没有索引)从Update-Database

CREATE TABLE [dbo].[Users] (
    [Id]  BIGINT   IDENTITY (1, 1) NOT NULL, 
    [Username] NVARCHAR (50) NULL, 
    [Email] NVARCHAR (255) NULL, 
    CONSTRAINT [PK_dbo.Users] PRIMARY KEY CLUSTERED ([Id] ASC) 
); 

结果(包括索引

CREATE TABLE [dbo].[Users] (
    [Id]  BIGINT   IDENTITY (1, 1) NOT NULL, 
    [Username] NVARCHAR (50) NULL, 
    [Email] NVARCHAR (255) NULL, 
    CONSTRAINT [PK_dbo.Users] PRIMARY KEY CLUSTERED ([Id] ASC) 
); 

GO 
CREATE UNIQUE NONCLUSTERED INDEX [IX_Username] 
    ON [dbo].[Users]([Username] ASC); 

回答

0

您使用的方法是“手动”代码第一次迁移。在哪里你可以摆弄剧本。自动迁移或删除创建,EF只是脚本一起脚本来匹配表和外键,并弹出它。即在添加代码之前,您会在生成的类中看到的内容。 :-)

使用自动迁移/创建方案,之后直接调用SQL命令以从代码添加索引。你有SQL代码来创建索引。只需触发初始化程序并跟随创建索引自定义例程。