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

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

使用下面的类,我们如何配置ReportRunStat之间的一对多关系,以便Report.RunStats将返回ReportCode字段相等的所有RunStat实体?

 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 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视为主键。

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

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

现在可以在EF Core 1.0 (EF7)中使用此function,如@Brian在2014年7月16日提供的参考中所示, 发布到Microsoft的UserVoice论坛的function请求 。

如果此信息在引用的页面上消失,这些有价值的信息不会丢失,这里是function请求的文本:

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

SQL Server和其他数据库支持表上的唯一约束。 外键约束通常基于主方的唯一约束,主键只是唯一约束的特殊情况。 entity framework目前仅支持基于主键的引用约束,并且没有唯一约束的概念。 我的想法是:

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

微软宣布在EF Core 1.0中实现此function:

已完成
(由Diego Vega(微软entity framework项目经理)于2016年8月9日发布)

在EF Core 1.0中添加了对此function的支持,我们没有计划将其添加到EF6代码库中。 此外,请为该function的具体改进创建新的想法。