我们正在使用EF 4.1和流畅的API从遗留数据库中获取数据(我们不允许更改)。我们在创建两个表之间的关系时遇到问题,其中相关列不是主键和外键。
通过以下课程,我们如何配置Report
和RunStat
之间的一对多关系,以便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
是主键。
答案 0 :(得分:11)
这是不可能的。 EF中的关系遵循与数据库中完全相同的规则。这意味着主表必须具有唯一标识符,该标识符由依赖表引用。在数据库的情况下,标识符可以是主表的主键或唯一列。否则它是无效的关系。
实体框架不支持唯一键。如果您希望Report
和RunStat
之间存在一对多关系,则您的从属表(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代码库中。另外,请创建 有关对该功能进行特定改进的新想法。