使用Entity Framework 4.1 Fluent API在非主键字段上创建关联

时间:2011-08-10 23:13:11

标签: c# entity-framework foreign-keys primary-key entity-framework-4.1

我们正在使用EF 4.1和流畅的API从遗留数据库中获取数据(我们不允许更改)。我们在创建两个表之间的关系时遇到问题,其中相关列不是主键和外键。

通过以下课程,我们如何配置ReportRunStat之间的一对多关系,以便Report.RunStats返回所有RunStat个实体ReportCode字段是否相等?

public class Report
{
    [Key]
    public int ReportKey { get; set; }
    public string Name { get; set; }
    public int ReportCode { get; set; } // Can we associate on this field?
    public virtual ICollection<RunStat> RunStats { get; set; }
}

public class RunStat
{
    [Key]
    public int RunStatKey { get; set; }
    public int ReportCode { get; set; }
    public DateTime RunDate { get; set; }
}

基本上,我想使用Fluent API配置EF,使其认为Report.ReportCode是外键,RunStat.ReportCode是主键。

2 个答案:

答案 0 :(得分:11)

这是不可能的。 EF中的关系遵循与数据库中完全相同的规则。这意味着主表必须具有唯一标识符,该标识符由依赖表引用。在数据库的情况下,标识符可以是主表的主键或唯一列。否则它是无效的关系。

实体框架不支持唯一键。如果您希望ReportRunStat之间存在一对多关系,则您的从属表(RunStat)必须包含值为Report.ReportKey的列。没有其他方法可以使其自动化 - 否则您必须简单地将其设置为自定义属性,并在需要时手动从实体框架填充它。

答案 1 :(得分:1)

此功能现在可以在 EF Core 1.0 (EF7)中使用,如@Brian在2014年7月16日向feature request posted to Microsoft's UserVoice forum提供的参考中所述。

因此,如果这些有价值的信息在引用的页面上消失了,那么这些宝贵的信息也不会丢失,这是功能请求的文本:

  

唯一约束(即候选密钥)支持
   (由Kati Iceva发表于2010年9月10日)

     

SQL Server和其他数据库在表上支持唯一约束。   外键约束通常基于对   主方,主键只是   独特的约束。实体框架当前仅支持   基于主键的引用约束,并且没有   唯一约束的概念。这个想法是:

     
      
  • 支持在实体上指定唯一约束
  •   
  • 支持指定外键关联,该关联在主体端指定包含唯一约束但   不是主键。
  •   

Microsoft宣布在EF Core 1.0中实现此功能:

  

已完成
   (由Diego Vega(Microsoft Entity Framework程序经理)于2016年8月9日发布)

     

在EF Core 1.0中添加了关闭该功能的支持,我们   没有计划将其添加到EF6代码库中。另外,请创建   有关对该功能进行特定改进的新想法。