[英]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.