实体框架外键问题

时间:2013-05-18 02:37:32

标签: c# entity-framework

首先,我想说的是我确实看到了这个问题很多。我知道可能有重复,但我搜索和搜索,我找不到正确的解决方案。

 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.

我有很多其他的这样的表,但是如果我能让这一个工作,那么我就可以解决所有问题了。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

只是为了添加Luke McGregor的回答,这种情况正在发生,因为你在同一个表中有两个自引用外键,默认情况下,实体框架会跳到错误的结论,并认为这意味着它们是两端的相同的关系(即假设你的两个外键试图建立父/子关系,这是错误的)。这就是为什么它要问哪一个是主体,哪一个是依赖。

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