EF正在为导航属性创建2个外键

时间:2014-11-15 04:10:49

标签: entity-framework entity-relationship

以下实体配置为其中一个导航属性创建双外键:

public User  : IdentityUser
{
     //public string Id { get; set; } //on base class

     public virtual ICollection<Earning> Earnings { get; set; }
}


public class Earning
{

    public int EarningId { get; set; }

    public virtual User User { get; set; }
    public string UserId { get; set; }

    public virtual User Sender { get; set; }
    public string SenderId { get; set; }


}

public class EarningConfiguraiton : EntityTypeConfiguration<Earning>
{
    public EarningConfiguraiton() 
    {
        this.HasRequired(e => e.User)
            .WithMany(u => u.Earnings)
            .HasForeignKey(e => e.UserId);

        this.HasRequired(e => e.Sender)
            .WithMany()
            .HasForeignKey(e => e.SenderId)
            .WillCascadeOnDelete(false);
    }
}

然而,它为2个导航属性生成3个外键。 “User_Id”看似多余。我应该删除,如果是这样的话?

   CreateTable(
            "dbo.Earnings",
            c => new
                {
                    EarningId = c.Int(nullable: false, identity: true),
                    UserId = c.String(maxLength: 128),
                    SenderId = c.String(maxLength: 128),                      
                    User_Id = c.String(maxLength: 128),
                })
            .PrimaryKey(t => t.EarningId)
            .ForeignKey("dbo.AspNetUsers", t => t.SenderId)
            .ForeignKey("dbo.AspNetUsers", t => t.UserId)
            .ForeignKey("dbo.AspNetUsers", t => t.User_Id)
            .Index(t => t.UserId)
            .Index(t => t.SenderId)
            .Index(t => t.User_Id);

更多context.Users.Include(u => u.Earnings)仅适用于已填充的User_Id列,而不适用于UserId。

我甚至在全新的数据库上生成此迁移

2 个答案:

答案 0 :(得分:1)

在这个问题上实际上有一个长期未完成的工作项,Fluent API无法正确处理反向导航属性。它被认为是一个低优先级问题,并且由于Triage而未包含在6.1版本中。 http://entityframework.codeplex.com/workitem/1135

答案 1 :(得分:0)

好的,我能够超越这个但是赏金仍然可用于更好的方式。

Gert在this answer的评论帮助我把它放在一起。

基本上,由于User上有2个Earning个实体,因此EF不会假设哪个实体对用户的Earnings集合是双向的。

使用[InversePropoperty]属性有效,但我无法使用Fluent Api进行配置:

解决方案:

 public User  : IdentityUser
 {  
     [InverseProperty("User")]
     public virtual ICollection<Earning> Earnings { get; set; }
 }


 public class Earning
 {
     [InverseProperty("Earnings")]
     public virtual User User { get; set; }

     public virtual User Sender { get; set; }
     public string SenderId { get; set; }
  }

现在它生成少一个外键。但是我无法使用Fluent Api进行配置。

public class EarningConfiguraiton : EntityTypeConfiguration<Earning>
{
    public EarningConfiguraiton() 
    {
        this.HasRequired(e => e.User)
            .WithMany(u => u.EmailEarnings)
            .HasForeignKey(e => e.UserId) //doesnt honor this. creates User_Id anyways
            .WillCascadeOnDelete(false);

    }
}

我不知道这是不是一个错误,但无论谁想出来都会得到赏金。我使用的是EF 6.1.1