[英]Create association on non-primary key fields with 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<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
视为主键。
这不可能。 EF 中的关系遵循与数据库中完全相同的规则。 这意味着主表必须具有唯一标识符,该标识符由从属表引用。 在数据库的情况下,标识符可以是主表的主键或唯一列。 否则它不是有效的关系。
实体框架不支持唯一键。 如果您想在Report
和RunStat
之间建立一对多关系,您的依赖表 ( RunStat
) 必须包含值为Report.ReportKey
的列。 没有其他方法可以使其自动化 - 否则您必须简单地将其设为自定义属性并在需要时手动从实体框架中填充它。
正如@Brian于 2014 年 7 月 16 日提供的对发布到 Microsoft 的 UserVoice 论坛的功能请求的参考中所示,此功能现在可以在EF Core 1.0 (EF7) 中实现。
因此,如果此信息在参考页面上消失,这些有价值的信息不会丢失,这里是功能请求的文本:
唯一约束(即候选键)支持
(由 Kati Iceva 于 2010 年 9 月 10 日发布)SQL 服务器和其他数据库支持对表的唯一约束。 外键约束通常基于主方的唯一约束,主键只是唯一约束的特例。 实体框架目前仅支持基于主键的引用约束,并且没有唯一约束的概念。 这个想法是:
- 支持在实体上指定唯一约束
- 支持指定在主体端指定包含唯一约束但不是主键的列的外键关联。
以及微软宣布在 EF Core 1.0 中实现这一能力的公告:
完全的
(由 Diego Vega(Microsoft Entity Framework 项目经理)于 2016 年 8 月 9 日发布)在 EF Core 1.0 中添加了对该功能的支持,我们没有计划将其添加到 EF6 代码库中。 此外,请为该功能的具体改进创造新的想法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.