以下实体配置为其中一个导航属性创建双外键:
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。
我甚至在全新的数据库上生成此迁移
答案 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