使用Fluent API .HasIndex()。HasName()进行代码优先迁移不起作用

时间:2019-05-02 13:03:21

标签: entity-framework ef-migrations ef-fluent-api

我正在使用EF 6.2。这是针对Oracle 12.1.0.2数据库的。

我可以使用以下代码创建索引;但是,当我运行Update-Database并检查索引时,我看到我提供的名称未使用。而是,该索引似乎使用默认命名约定“ IX_TableName_ColumnName_GUID”来命名。当我也尝试撤消这些更改时,这也会成为问题,因为此处提供的索引名称也未使用。

我也尝试过在数据注释中指定索引(也显示在下面的代码中)。

此外,我尝试将代码的两个部分都保留在原处,但都无济于事。我仍然最终得到的索引没有命名为我想要的。

数据注释

        [Column(TypeName = "int")]
        [Index("IXTest", 1)]
        public Int32 PARENT_ID { get; set; }

        [Column(TypeName = "int")]
        [Index("IXTest", 2)]
        public Int32 ACTION_ID { get; set; }

Fluent API

modelBuilder.Entity<PARENT_ACTION>()
                .HasIndex(e => new { e.PARENT_ID, e.ACTION_ID })
                .HasName("IXTest");

这是运行“ Add-Migration IXTest”后生成的方法

        public override void Up()
        {
            CreateIndex("USER.PARENT_ACTION", new[] { "PARENT_ID", "ACTION_ID" }, name: "IXTest");
        }

        public override void Down()
        {
            DropIndex("USER.PARENT_ACTION", "IXTest");
        }

这是使用“ Update-Database -Verbose”命令时记录的sql

begin
  execute immediate
  'create index "USER"."IX_PARENT_ACTION_P_1329803955" on "USER"."PARENT_ACTION" ("PARENT_ID", "ACTION_ID")';
exception
  when others then
    if sqlcode <> -1408 then
      raise;
    end if;
end;

这是我针对先前的迁移以撤消索引更改时记录的sql

begin
  execute immediate
  'drop index "USER"."IX_PARENT_ACTION_"';
exception
  when others then
    if sqlcode <> -1418 then
      raise;
    end if;
end;

我希望使用Fluent API或数据注释,我指定的索引名称将在Update-Database命令中使用,尤其是因为调用了“ CreateIndex”方法并提供了正确的名称。

1 个答案:

答案 0 :(得分:0)

根据这篇文章,这是Oracle.ManagedDataAccess.EntityFramework的错误。另外,似乎此错误尚未修复,因为我使用的是此软件包的最新版本:18.3.0。

Oracle.ManagedDataAccess.EntityFramework 12.2.1100 Index Names/Migrations