2011-08-31 89 views
1

我已經搜索已經回答的問題,但沒有找到我的問題的答案。對我感到羞恥。EF代碼 - 第一個複合「導航」鍵

我有這種情況:

public class Content 
{ 
    [Key] 
    [StringLength(36, ErrorMessage="Must have 36 characters")] 
    [Required(ErrorMessage="Must have a unique GUID")] 
    public string GUID { get; set; } 

    public virtual ICollection<RegionalInfo> RegionalInfo { get; set; } 
} 

public class RegionalInfo 
{ 
    [Key] 
    public virtual Content Content { get; set; } 

    [Key] 
    public virtual Region Region { get; set; } 
} 

public class Region 
{ 
    [Key] 
    [StringLength(5, ErrorMessage="ID must have 5 characters")] 
    [Required] 
    [RegularExpression(@"[a-z]{2}-[A-Z]{2}", ErrorMessage = "ID must be in ISO 639 standard")] 
    public string ID { get; set; } 

    public string Country { get; set; } 

    public string Language { get; set; } 
} 

但我不能得到這個工作。 EF表示「RegionalInfo沒有Key定義」。

簡而言之,我試圖在包含Content.GUID和Region.ID的這個類「RegionalInfo」上創建一個組合鍵。

對於Contents表中的每一個UNIQUE Con​​tent,RegionalInfo表中都存在許多「翻譯」。

回答

2

我假設你使用了一個DbContext。根據這個假設,你應該定義在RegionalInfo類關鍵字,像這樣

public class RegionalInfo 
{ 
    [Key] 
    public String ContentId { get; set; } 
    public virtual Content Content { get; set; } 

    [Key] 
    public string RegionId { get; set; } 
    public virtual Region Region { get; set; } 
} 

,並在你的上下文類,你做到以下幾點:

protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder) 
    { 
     // Composite key definition 
     modelBuilder.Entity<RegionalInfo>().HasKey(x => new { x.ContentId, x.RegionId }); 
     // And if I remember correctly this was required in order to do 
     // var x = contentObject.RegionalInfo.Where(....) stuff 
     modelBuilder.Entity<RegionalInfo>().HasRequired<Content>(x => x.Content).WithMany(x => x.RegionalInfo).HasForeignKey(x => x.ContentId); 
    } 

這應該做的伎倆

+0

這段代碼上爲了使組合鍵工作而需要的上下文類?這是否會避免對集成了組合鍵的單個列進行唯一性檢查,並只檢查兩列? – programad

+0

至於你的第一個問題,我昨天自己試了一下:對於HasKey(),在我的情況下是必要的。沒有它,我仍然得到「RegionalInfo沒有鍵定義」的例外。 HasRequired()線我真的不確定。我從我也有類似的情況(圖像實體,圖庫實體和圖庫中包含圖像集合的ImageGallery實體)複製了該圖像。至於你的第二個問題,在RegionalInfo表中將生成一個包含ContentId和RegionId的主鍵,以便組合是唯一的,而不是單個列。 –