EF 导航 属性 通过键以外的不同属性

EF Navigational Property through Different Properties Other Than Key

我正在使用 classes 映射遗留应用程序并针对它使用 EntityFramework

我在这个遗留数据库中发现的一个缺陷是多个 table 通过 2 个不同的字段引用特定的 table。

我不确定这是否可行以及为什么我似乎找不到任何相关信息所以我来了。

这是一个视觉示例:

public class Term {
    [Key]
    public string Id { get; set; } // sample value: "12-34-56/78"
    public string CleanId { get; set; } // sample value: "12345678" (basically the Id without special characters)
    public DateTime Date { get; set; }
}

public class App {
    public int Id { get; set; }
    public string CleanTermId { get; set; } // foreign key is in Term class using the `CleanId` field
}

public class Question {
    public int Id { get; set; }
    public string TermId { get; set; } // foreign key is in Term class using the `Id` field
}

如何使用 DataAnnotations(首选)从 AppQuestionTerm class ) 到 Fluent API?我不需要从 TermAppQuestion 的导航 属性,但如果您的回答包含它也没关系。

如果不清楚请告诉我。

在 EF Core 之前的 EF 版本中不支持加入主键以外的字段,但是你提到它是一个遗留应用程序,我怀疑你是否想要彻底改造它以便能够使用 EF Core .

用户语音请求添加该功能 Here,响应是他们没有计划将此功能添加到 EF6 - 因此 Core 将是真正做到这一点的唯一方法。

就您的 类 而言,您可以 link Question 和 Term 作为其基础 PK - FK,但 App to Term 都基于非 PK 字段,即使数据库上的唯一约束,这是 Core

之前的 EF 不支持的内容

您好,这是正确的代码:

    public class Term
{
    [Key]
    public string Id { get; set; }
    public string CleanId { get; set; }
    public DateTime Date { get; set; }
}

public class App
{
    public int Id { get; set; }

    [ForeignKey("CleanTermId")]
    public Term MyTerm { get; set; }
    public string CleanTermId { get; set; } 

}

public class Question
{
    public int Id { get; set; }

    [ForeignKey("TermId")]
    public Term MyTerm { get; set; }
    public string TermId { get; set; }
}