Повторно использованные отношения FK Zero-to-One в EF Code First с аннотациями данных

У меня есть некоторый код, который не производит отношения FK, которые я хочу в базе данных.

У меня есть два объекта, назовем их Deals и Salespeople. В сделке может быть записано ноль, один или оба из двух отдельных продавцов: один - переговорщик, создавший сделку, второй - ближе, закрывший сделку. Так что это две отдельные связи 0:1 к одной и той же таблице.

Кроме того, мы скажем, что у Deal есть Создатель, который является пользователем системы, это то, что пользователь системы делал, чтобы вводить данные в информацию. Я включил эту запись, чтобы показать, как я справился со всеми остальными связями с внешними ключами в своем решении, которое прекрасно работает (дает мне контроль над именованием ключей и всем остальным).

Вот мой (урезанный) код:

[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 создать отношения внешнего ключа Negotiator (FK to Salesperson) и Closer (FK to Salesperson), используя только аннотации данных, но если есть другие решения с управлением кодом, которые могут сделать это, я ' Я открыт для этого.

Спасибо за вашу помощь.

1 ответ

Решение

Вместо использования способа атрибута для сделок, я бы сделал через 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());
}
Другие вопросы по тегам