通过除键以外的其他属性的EF导航属性

时间:2018-11-06 16:04:38

标签: c# entity-framework foreign-keys data-annotations ef-fluent-api

我正在使用类映射旧版应用程序,并对其使用EntityFramework

我在此旧版数据库中发现的一个缺陷是,多个表通过2个不同的字段引用了一个特定的表。

我不确定这是否可行,为什么我似乎找不到任何东西,所以我在这里。

这是一个视觉样本:

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
}

如何使用App(首选)到Question,将TermDataAnnotations的导航属性正确地添加到Fluent API类中?我不需要从TermAppQuestion的导航属性,但是如果您的答案包括它也可以。

让我知道是否不清楚。

2 个答案:

答案 0 :(得分:1)

在主键以外的其他字段上加入的功能在EF Core之前的EF版本中是不受支持的,但是,由于提到它是旧版应用程序,我怀疑您是否希望对其进行全面修改以使其能够使用EF Core。 / p>

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

就您的班级而言,您可以将“问题”和“术语”作为其基础的PK-FK进行链接,但是“应用程序到术语”基于非PK字段,即使在数据库上具有唯一性约束也是如此。 Core之前的EF不支持

答案 1 :(得分:0)

嗨,这是正确的代码:

    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; }
}