使用代碼優先遷移在實體框架7中添加索引作為外鍵的字段

asp.net c# ef-code-first entity-framework-core

我認為這很容易(著名的遺言),但我是EF7和Code First概念的新手,而.Net 5和EF7在這一點上相對較新,所以目前還沒有多少。我正在將一個項目從舊學校ASP 2.0轉換為.Net 5,我正在重新創建整個數據庫結構,因此Code First Migrations在這裡是我的不錯選擇。

我有一個AdvertisementHistory錶鍊接回一個Advertisement表,對於每個Advertisement記錄,每個廣告運行的每個月都會在AdvertisementHistory表中有一條記錄。我基本上按月和年份跟踪Ad“Hit Counts”。我想在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”,一切正常,它會生成代碼以生成正確的索引(儘管由於我需要廣告ID而導致錯誤)。但這意味著這肯定與他們在我的索引中使用外鍵的字段有關。我已經在類上嘗試了不同的變體和註釋,但沒有任何東西讓我乾淨的遷移。

正如你所看到的那樣,我正在努力從極簡主義的角度對其進行編碼,並讓.Net“盡我所能”。這就是為什麼我認為我在這裡缺少一些非常簡單的東西,因為這不是一個不尋常的概念。

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

感謝高級社區......

一般承認的答案

嘗試這個。你真正想要的是為Advertisement添加一個外鍵註釋並在你的索引中使用它:

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 })
}  


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow