使用Entity Framework 4.1 Fluent API在非主键字段上创建关联
我们使用EF 4.1和流畅的API从遗留数据库中获取数据(我们不允许更改)。 我们在创建两个表之间的关系时遇到问题,其中相关列不是主键和外键。
使用下面的类,我们如何配置Report
和RunStat
之间的一对多关系,以便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不支持唯一键。 如果要在Report
和RunStat
之间建立一对多关系, 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的具体改进创建新的想法。