簡體   English   中英

使用 Entity Framework 4.1 Fluent API 在非主鍵字段上創建關聯

[英]Create association on non-primary key fields with Entity Framework 4.1 Fluent API

我們正在使用 EF 4.1 和流利的 API 從遺留數據庫中獲取數據(我們不允許更改)。 我們在創建兩個表之間的關系時遇到問題,其中相關列不是主鍵和外鍵。

使用下面的類,我們將如何配置ReportRunStat之間的一對多關系,以便Report.RunStats將返回ReportCode字段相等的所有RunStat實體?

public class Report
{
    [Key]
    public int ReportKey { get; set; }
    public string Name { get; set; }
    public int ReportCode { get; set; } // Can we associate on this field?
    public virtual ICollection<RunStat> RunStats { get; set; }
}

public class RunStat
{
    [Key]
    public int RunStatKey { get; set; }
    public int ReportCode { get; set; }
    public DateTime RunDate { get; set; }
}

基本上,我想使用 Fluent API 來配置 EF,使其將Report.ReportCode視為外鍵,將RunStat.ReportCode視為主鍵。

這不可能。 EF 中的關系遵循與數據庫中完全相同的規則。 這意味着主表必須具有唯一標識符,該標識符由從屬表引用。 在數據庫的情況下,標識符可以是主表的主鍵或唯一列。 否則它不是有效的關系。

實體框架不支持唯一鍵。 如果您想在ReportRunStat之間建立一對多關系,您的依賴表 ( RunStat ) 必須包含值為Report.ReportKey的列。 沒有其他方法可以使其自動化 - 否則您必須簡單地將其設為自定義屬性並在需要時手動從實體框架中填充它。

正如@Brian於 2014 年 7 月 16 日提供的對發布到 Microsoft 的 UserVoice 論壇的功能請求的參考中所示,此功能現在可以在EF Core 1.0 (EF7) 中實現。

因此,如果此信息在參考頁面上消失,這些有價值的信息不會丟失,這里是功能請求的文本:

唯一約束(即候選鍵)支持
(由 Kati Iceva 於 2010 年 9 月 10 日發布)

SQL 服務器和其他數據庫支持對表的唯一約束。 外鍵約束通常基於主方的唯一約束,主鍵只是唯一約束的特例。 實體框架目前僅支持基於主鍵的引用約束,並且沒有唯一約束的概念。 這個想法是:

  • 支持在實體上指定唯一約束
  • 支持指定在主體端指定包含唯一約束但不是主鍵的列的外鍵關聯。

以及微軟宣布在 EF Core 1.0 中實現這一能力的公告:

完全的
(由 Diego Vega(Microsoft Entity Framework 項目經理)於 2016 年 8 月 9 日發布)

在 EF Core 1.0 中添加了對該功能的支持,我們沒有計划將其添加到 EF6 代碼庫中。 此外,請為該功能的具體改進創造新的想法。

暫無
暫無

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

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