C# 在EF代码中重新使用零对一FK关系,首先使用数据注释

C# 在EF代码中重新使用零对一FK关系,首先使用数据注释,c#,entity-framework,foreign-keys,data-annotations,C#,Entity Framework,Foreign Keys,Data Annotations,我有一些代码没有在数据库中生成我想要的FK关系 我有两个目标,我们称之为交易和销售人员。一笔交易可以记录两名独立销售人员中的零名、一名或两名:一名是创建交易的谈判者,一名是完成交易的接近者。这是同一个表的两个独立的0:1关系 此外,我们会说,该交易有一个创建者,他是系统中的用户,这就是系统用户对信息进行数据输入的原因。我加入这个条目是为了展示我是如何在解决方案中完成所有外键关系的,它工作得很好(让我可以控制键的命名和一切) 以下是我的(精简)代码: [表(“销售人员”)] 公开课销售员 { //

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

我有两个目标,我们称之为交易和销售人员。一笔交易可以记录两名独立销售人员中的零名、一名或两名:一名是创建交易的谈判者,一名是完成交易的接近者。这是同一个表的两个独立的0:1关系

此外,我们会说,该交易有一个创建者,他是系统中的用户,这就是系统用户对信息进行数据输入的原因。我加入这个条目是为了展示我是如何在解决方案中完成所有外键关系的,它工作得很好(让我可以控制键的命名和一切)

以下是我的(精简)代码:

[表(“销售人员”)]
公开课销售员
{
//建造师之类的
[键,列(“销售人员ID”)]
public int SalesId{get;set;}
[反向财产(“谈判者”)]
公共虚拟ICollection协商数据{get;set;}
[反向属性(“闭合器”)]
公共虚拟ICollection ClosedDeals{get;set;}
}
[表(“交易”)]
公共类交易
{
//构造函数、杂项属性等
[关键]
public int DealId{get;set;}
//这使我可以管理FK的DB字段名称,并且可以正常工作
[外键(“创建者”),最大长度(128)]
公共字符串创建者用户{get;set;}
公共虚拟系统用户创建者{get;set;}
//这不起作用:未生成FK关系
[外键(“闭合器”)]
公共int?CloserId{get;set;}
公共虚拟销售人员关闭{get;set;}
[外宾(“谈判者”)]
公共int?协商ID{get;set;}
公共虚拟销售人员谈判者{get;set;}
}
我想弄清楚如何让EF只使用数据注释创建协商者(FK到销售人员)和更紧密的外键关系(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);
   }
}

太好了,谢谢!虽然系统中的所有其他DB配置都是通过数据注释进行管理的,所以如果可以的话,我肯定希望找到一个基于DA的解决方案。您的代码对我来说运行良好。EF在Deals表中生成的协商ID和CloserId都是FK到Salespers(或Salespers)表中的。奇怪。我同意它肯定会起作用,一切似乎都在遵循中列出的说明--它只是。。。不是!谢谢你的检查!
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);
   }
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
  /*Other mappings*/
  modelBuilder.Configurations.Add((new DealMapping());
}