【问题标题】:Create association on non-primary key fields with Entity Framework 4.1 Fluent API使用 Entity Framework 4.1 Fluent API 在非主键字段上创建关联
【发布时间】:2011-08-10 23:13:11
【问题描述】:

我们正在使用 EF 4.1 和 fluent 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<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 视为主键。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    【解决方案2】:

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

    为了让这些有价值的信息在参考页面上消失时不会丢失,这里是功能请求的文本:

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

    SQL Server 和其他数据库支持表上的唯一约束。 外键约束一般基于唯一约束 主方,主键只是一个特例 唯一的约束。 Entity Framework 目前只支持 基于主键的引用约束并且没有 唯一约束的概念。这个想法是:

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

    以及微软宣布在 EF Core 1.0 中实现此功能的公告:

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

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

    【讨论】:

    猜你喜欢
    • 2011-11-03
    • 1970-01-01
    • 1970-01-01
    • 2011-09-28
    • 2011-11-10
    • 1970-01-01
    • 2011-11-03
    • 2023-03-20
    • 2018-02-08
    相关资源
    最近更新 更多