我有一些代码没有在数据库中产生我想要的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到销售人员)的外键关系,但是如果有其他代码管理的解决方案可以做到这一点我很开心。
感谢您的帮助。
答案 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());
}