在EF Code First和数据注释中重复使用零到一FK关系

时间:2015-04-08 23:07:34

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

我有一些代码没有在数据库中产生我想要的FK关系。

我有两个对象,我们称之为交易和销售人员。交易可以记录两个独立的销售人员中的零个,一个或两个:一个是创建交易的谈判者,一个是关闭交易的关闭者。所以这是两个独立的0:1关系到同一个表。

此外,我们会说交易有一个创建者谁是系统中的用户,这是系统用户碰巧在信息上进行数据输入。我将此条目包括在内,以显示我在我的解决方案中如何完成其​​余的所有外键关系,这非常有效(让我可以控制关​​键命名和所有内容)。

这是我的(精简版)代码:

[Table("Salespersons")]
public class Salesperson
{
    // constructor and whatnot

    [Key, Column("SalespersonId")]
    public int SalesId { get; set; }

    [InverseProperty("Negotiator")]
    public virtual ICollection<Deal> NegotiatedDeals { get; set; }
    [InverseProperty("Closer")]
    public virtual ICollection<Deal> ClosedDeals { get; set; }
}

[Table("Deals")]
public class Deal
{
    // constructor, misc properties etc

    [Key]
    public int DealId { get; set; }

    // This lets me govern the name of the DB field for the FK & works correctly
    [ForeignKey("Creator"), MaxLength(128)]
    public string CreatorUser { get; set; }
    public virtual SystemUser Creator { get; set; }

    // This doesn't work: no FK relationships generated
    [ForeignKey("Closer")]
    public int? CloserId { get; set; }
    public virtual Salesperson Closer { get; set; }

    [ForeignKey("Negotiator")]
    public int? NegotiatorId { get; set; }
    public virtual Salesperson Negotiator { get; set; }
}

我想弄清楚如何仅使用数据注释使EF创建谈判者(FK到销售人员)和更接近(FK到销售人员)的外键关系,但是如果有其他代码管理的解决方案可以做到这一点我很开心。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

不是使用属性方式进行交易,而是通过EntityTypeConfiguration

public class DealMapping : EntityTypeConfiguration<Deal>
{
   public DealMapping()
   {
      ToTable("Deals");
      HasKey(c=>c.DealId);
      HasOptional(d => d.Closer).WithMany(s=>s.ClosedDeals).HasForeignKey(p=>p.CloserId);
      HasOptional(d => d.Negotiator).WithMany(s=>s.NegotiatedDeals).HasForeignKey(p=>p.NegotiatorId);
   }
}

和您的DbContext

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
  /*Other mappings*/
  modelBuilder.Configurations.Add((new DealMapping());
}