簡體   English   中英

在帶有外行鍵字段的代碼優先遷移的Entity Framework 7中添加索引

[英]Adding an Index in Entity Framework 7 with Code First Migrations on a field that is a Foreign Key

我認為這將很容易(著名的遺言),但是我對EF7和Code First概念還是陌生的,而.Net 5和EF7在這一點上還相對較新,因此目前尚不多。 我正在將一個項目從舊版本的ASP 2.0轉換為.Net 5,並且正在重新創建整個數據庫結構,因此“代碼優先遷移”對我來說是個不錯的選擇。

我有一個AdvertisementHistory表,該表鏈接回到Advertisement表,對於每個廣告記錄,每年廣告運行的每個月,AdvertisementHistory表中都會有一條記錄。 我基本上是按月份和年份跟蹤廣告的“點擊計數”。 我想在AdvertisementHistory中的“ AdvertisementID,Year,Month”上放置一個唯一索引,我當然知道如何在SQL中執行此操作,但是EF Code First對我大喊大叫:

public class Advertisement
{
    public int ID { get; set; }

    [Required]
    public string ImageURL { get; set; }

    [Required]
    public string DestinationURL { get; set; }

    {{....Removing other fields you don't care about}}
}

public class AdvertisementHistory
{
    public int ID { get; set; }

    [Required]
    public Advertisement Advertisement { get; set; }

    [Required]
    public int Year { get; set; }

    [Required]
    public int Month { get; set; }

    [Required]
    public int Clicked { get; set; }

    {{....Removing other fields you don't care about}}
}

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public DbSet<Advertisement> Advertisements { get; set; }
    public DbSet<AdvertisementHistory> AdvertisementHistory { get; set; }
    {{....Removing other classes you don't care about}}

    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);

        builder.Entity<AdvertisementHistory>()
            .HasIndex(p => new { p.Advertisement, p.Year, p.Month })
            .IsUnique();
    }
}

然后我打開“命令窗口”,因為我們還沒有.Net 5 EF7的項目控制台:

CMD> dnx ef遷移添加Initial_FS

結果如下:

{{....一堆東西正確生成}}

無法將屬性“ Advertisement”添加到實體類型“ AdvertisementHistory”,因為在實體類型“ AdvertisementHistory”上已經存在具有相同名稱的導航屬性。

因此,如果我從.HasIndex調用中刪除“ p.Advertisement”,那么一切都會正常運行,並且它會生成代碼以建立適當的索引(盡管由於我需要Ad ID,所以它是一個不好的索引)。 但這意味着,這肯定與我在索引中使用外鍵的字段有關。 我在類上嘗試了多種不同的變體和注釋,但是沒有任何東西可以使我順利遷移。

如您所見,我正在努力從極簡主義的角度對此進行編碼,並讓.Net盡我所能。 這就是為什么我認為我在這里缺少非常簡單的東西的原因,因為這不是一個不尋常的概念。

而且,如果您想知道這(大多數情況下)是一次初始遷移,因為數據庫中當前存在的唯一表就是您從AspNet.Identity獲得的表。

謝謝高級社區...

嘗試這個。 您真正想要的是為廣告添加外鍵注釋,並在索引中使用它:

public class Advertisement
{
    public int ID { get; set; }
    [Required]
    public string ImageURL { get; set; }
    [Required]
    public string DestinationURL { get; set; }
}

public class AdvertisementHistory
{
    public int ID { get; set; }
    public int AdvertisementID { get; set; }
    [Required]
    [ForeignKey("AdvertisementID")]
    public Advertisement Advertisement { get; set; }
    [Required]
    public int Year { get; set; }
    [Required]
    public int Month { get; set; }
    [Required]
    public int Clicked { get; set; }
}

protected override void OnModelCreating(ModelBuilder builder)
{
    base.OnModelCreating(builder);

    builder.Entity<AdvertisementHistory>()
        .HasIndex(p => new { p.AdvertisementID, p.Year, p.Month })
}  

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM