在带有数据注释的 EF Code First 中重新使用零到一 FK 关系
Re-used Zero-to-One FK relationships in EF Code First with Data Annotations
我有一些代码无法在数据库中生成我想要的 FK 关系。
我有两个对象,我们称它们为交易和销售人员。一笔交易可以有零个、一个或两个单独的销售人员记录:一个是创建交易的谈判者,一个是完成交易的 Closer。所以这是两个独立的 0:1 关系到相同的 table.
此外,我们会说 Deal 有一个 Creator,他是系统中的用户,也就是碰巧对信息进行数据输入的任何系统用户。我包括该条目以展示我如何在我的解决方案中完成所有其余的外键关系,它工作得很好(让我控制键命名和一切)。
这是我的(精简版)代码:
[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 到销售人员)和 Closer(FK 到销售人员)外键关系,但是如果有其他代码管理的解决方案可以让这一切发生我愿意接受。
感谢您的帮助。
我不会使用属性方式进行交易,而是通过 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());
}
我有一些代码无法在数据库中生成我想要的 FK 关系。
我有两个对象,我们称它们为交易和销售人员。一笔交易可以有零个、一个或两个单独的销售人员记录:一个是创建交易的谈判者,一个是完成交易的 Closer。所以这是两个独立的 0:1 关系到相同的 table.
此外,我们会说 Deal 有一个 Creator,他是系统中的用户,也就是碰巧对信息进行数据输入的任何系统用户。我包括该条目以展示我如何在我的解决方案中完成所有其余的外键关系,它工作得很好(让我控制键命名和一切)。
这是我的(精简版)代码:
[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 到销售人员)和 Closer(FK 到销售人员)外键关系,但是如果有其他代码管理的解决方案可以让这一切发生我愿意接受。
感谢您的帮助。
我不会使用属性方式进行交易,而是通过 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());
}