2

我首先使用EF4代碼,並希望生成一個由類屬性和外鍵組成的組合鍵。我有兩個類:訂單和公司。訂單類有一個參考,但這不一定是公司之間唯一的。所以我打算使用由Reference和Company.CompanyId組成的組合鍵。我該如何創建一個包含帶密碼的外鍵的組合鍵?

我已經嘗試使用以下設置,但我收到一條錯誤消息「密鑰表達式無效」。

modelBuilder.Entity<Order>().HasKey(o => new { o.Reference, o.Company.CompanyId }); 

我也曾嘗試

modelBuilder.Entity<Order>().HasKey(o => new { o.Reference, o.Company }); 

和失敗。

這些都是我的課:

public class Order 
{ 
    public string Reference { get; set; } 
    public Company Company { get; set; } 
} 

public class Company 
{ 
    public int CompanyId { get; set; } 
    public virtual ICollection Orders { get; set; } 
} 

任何幫助將不勝感激。

回答

1

有一點看起來不太正確的是您使用非通用版本的ICollection。試試這個:

public virtual ICollection<Order> Orders { get; set; } 
1

你試過這個嗎?

modelBuilder.Entity()。HasKey(o => o.Reference); modelBuilder.Entity()。HasKey(o => o.CompanyId);

0

根據this source,在密鑰中只允許標量屬性。導航屬性不是。

5

正如Antony Highsky所提到的,您只能在密鑰中使用標量屬性。 所以,你需要一個外鍵(標量屬性)添加到訂單類,它與導航性能公司關聯,如下圖所示:

public class Order 
{ 
    public string Reference { get; set; } 

    public int CompanyId { get; set; } 

    [RelatedTo(ForeignKey = "CompanyId")] 
    public Company Company { get; set; } 
} 

,然後使用創建複合鍵模型生成器:

modelBuilder.Entity<Order>().HasKey(o => new { o.Reference, o.CompanyId }); 

注意數據標註(願意與我們的屬性)與實體框架CTP 3.介紹了該只使用,而不是HasKey方法數據註解的另一種選擇,看到這個帖子:

相關問題