亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

實體框架索引生成錯誤

實體框架索引生成錯誤

C#
DIEA 2021-11-07 20:06:06
我正在嘗試創建 2 個這樣的索引:modelBuilder.Entity<MyEntity>()    .HasIndex(p => new { p.Column1, p.Column2, p.Column3, p.Column4 })    .HasName("ix_index1")    .IsUnique();modelBuilder.Entity<MyEntity>()    .HasIndex(p => new { p.Column1, p.Column2, p.Column3 })    .HasName("ix_index2")    .IsUnique();運行命令后add-migration InitialCreate,我得到的回報是這個腳本:CreateTable(    "DEV.MyEntity",    c => new        {            Column1 = c.String(nullable: false, maxLength: 10),            Column2 = c.Decimal(nullable: false, precision: 19, scale: 0),            Column3 = c.Decimal(nullable: false, precision: 10, scale: 0),            Column4 = c.Decimal(nullable: false, precision: 10, scale: 0),        })    .PrimaryKey(t => new { t.Column1, t.Column2, t.Column3 })    .Index(t => new { t.Column1, t.Column2, t.Column3 }, unique: true, name: "ix_index2")    .Index(t => t.Column4, unique: true, name: "ix_index1");是否有原因ix_index1只Column4存在索引中的所有列?預期結果是ix_index14 列。如果這是相關的,我正在使用托管 Oracle 數據庫提供程序。實體框架版本 6.2。
查看完整描述

2 回答

?
忽然笑

TA貢獻1806條經驗 獲得超5個贊

看起來像 EF6 錯誤(我猜是為了優化冗余索引)。數據庫提供程序無關緊要(SqlServer 提供程序也是如此)。

一種錯誤的行為是你所描述的。另一種情況是,如果您交換兩次HasIndex調用的順序,生成的遷移包含正確的ix_index1,但ix_index2根本沒有。

由于這是一個錯誤,除了將問題報告給 EF6 問題跟蹤器并等待最終修復之外,別無他法。

但是,如果(Column1, Column2, Column2)是遷移所指示的 PK ,則該 PKix_index2是多余的,您可以安全地將其從 fluent 配置中刪除,這將允許正確生成ix_index1.


查看完整回答
反對 回復 2021-11-07
?
MM們

TA貢獻1886條經驗 獲得超2個贊

好的,因為我最初嘗試的方法被確認由于錯誤而被破壞 - 我能夠找到另一個解決方案,它似乎工作正常,但更臟。


例如,假設您要創建 4 個索引,如下所示:


modelBuilder.Entity<MyEntity2>()

    .HasIndex(p => new { p.Column1, p.Column2, p.Column3, p.Column5 })

    .HasName("ix_1")

    .IsUnique();


modelBuilder.Entity<MyEntity2>()

    .HasIndex(p => new { p.Column1, p.Column2, p.Column4, p.Column5 })

    .HasName("ix_2")

    .IsUnique();


modelBuilder.Entity<MyEntity2>()

    .HasIndex(p => new { p.Column1, p.Column2, p.Column3 })

    .HasName("ix_3")

    .IsUnique();


modelBuilder.Entity<MyEntity2>()

    .HasIndex(p => new { p.Column1, p.Column2, p.Column4 })

    .HasName("ix_4")

    .IsUnique();

結果(截至撰寫本文時 31.07.2018)將被破壞。


要正確創建所有索引,您必須改用以下方法:


modelBuilder.Entity<MyEntity2>()

    .Property(e => e.Column1)

    .HasColumnAnnotation(

        IndexAnnotation.AnnotationName,

        new IndexAnnotation(new[]

        {

            new IndexAttribute("ix_3", 1) { IsUnique = true },

            new IndexAttribute("ix_4", 1) { IsUnique = true },

            new IndexAttribute("ix_2", 1) { IsUnique = true },

            new IndexAttribute("ix_1", 1) { IsUnique = true }

        }));


modelBuilder.Entity<MyEntity2>()

    .Property(e => e.Column2)

    .HasColumnAnnotation(

        IndexAnnotation.AnnotationName,

        new IndexAnnotation(new[]

        {

            new IndexAttribute("ix_3", 2) { IsUnique = true },

            new IndexAttribute("ix_4", 2) { IsUnique = true },

            new IndexAttribute("ix_2", 2) { IsUnique = true },

            new IndexAttribute("ix_1", 2) { IsUnique = true }

        }));


modelBuilder.Entity<MyEntity2>()

    .Property(e => e.Column3)

    .HasColumnAnnotation(

        IndexAnnotation.AnnotationName,

        new IndexAnnotation(new[]

        {

            new IndexAttribute("ix_3", 3) { IsUnique = true },

            new IndexAttribute("ix_1", 3) { IsUnique = true }

        }));


modelBuilder.Entity<MyEntity2>()

    .Property(e => e.Column4)

    .HasColumnAnnotation(

        IndexAnnotation.AnnotationName,

        new IndexAnnotation(new[]

        {

            new IndexAttribute("ix_4", 3) { IsUnique = true },

            new IndexAttribute("ix_2", 3) { IsUnique = true },

        }));


modelBuilder.Entity<MyEntity2>()

    .Property(e => e.Column5)

    .HasColumnAnnotation(

        IndexAnnotation.AnnotationName,

        new IndexAnnotation(new[]

        {

            new IndexAttribute("ix_2", 4) { IsUnique = true },

            new IndexAttribute("ix_1", 4) { IsUnique = true },

        }));

我希望我沒有搞砸任何數字。但是這個想法應該是可以理解的。


查看完整回答
反對 回復 2021-11-07
  • 2 回答
  • 0 關注
  • 208 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號