1

首先,我想说我确实经常看到这个问题。我知道可能有重复,但我已经搜索和搜索,但我没有找到正确的解决方案。

 public class Members
{
    public enum Statuses
    {
        APPLIED,
        ACTIVE,
        SUSPENDED,
        DELETED
    }

    [Key]
    public int ID { get; set; }
    [Required]
    public string UName { get; set; }
    public int RecruiterID { get; set; }
    public int AuditorID { get; set; }
    public virtual ICollection<AuditorComments> AuditorComments { get; set; }
    [Required]
    public Statuses Status { get; set; }
    [Timestamp]
    public Byte[] Timestamp { get; set; }

    [ForeignKey("RecruiterID")]
    public virtual Members Recruiter { get; set; }
    [ForeignKey("AuditorID")]
    public virtual Members Auditor { get; set; }
}

基本上我把外键绑在一起了吗?

这是我收到的错误:

Unable to determine the principal end of an association between the types
'tn.Data.Members' and 'tn.Data.Members'. The principal end of this association
must be explicitly configured using either the relationship fluent API or data
annotations.

我有很多其他这样的桌子,但如果我能让这张桌子工作,那么我就能把它们都修好。

4

2 回答 2

2

我会更简洁地使用这些关系的流利规范,因为它们有点整洁,让实际的类纯 POCO 和 IMO 更容易阅读。

另一方面,您所描述的结构实际上对于 SQL 来说实际上是不可能的,因为成员需要成员,这意味着您不能引导您的模型,并且它总是会有循环。

以下是如何使用流畅的配置来做到这一点。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Members>()
        .HasOptional(m => m.Auditor)
        .WithMany()
        .HasForeignKey(p => p.AuditorId);

    modelBuilder.Entity<Members>()
        .HasOptional(m => m.Recruiter)
        .WithMany()
        .HasForeignKey(p => p.RecruiterId);
}

有关如何在 EF 中使用导航属性的更多详细信息,请查看我的文章:http: //blog.staticvoid.co.nz/2012/7/17/entity_framework-navigation_property_basics_with_code_first

于 2013-05-18T05:17:56.987 回答
2

只是为了补充卢克麦格雷戈的答案,这是因为您在同一个表中有两个自引用外键,并且默认情况下实体框架会跳到错误的结论并认为这意味着它们是同一关系的两端(即,错误地假设您的两个外键正在尝试建立父/子关系)。这就是为什么它要问哪个是委托人,哪个是从属。

目前,我认为没有办法单独纠正对数据注释属性的误解,因此您必须按照 Luke 的建议使用 Fluent API。

于 2013-05-18T05:18:51.017 回答