Повторно использованные отношения 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());
}