【问题标题】:How to specify composite relationships in EF code-first that don't map to PKs如何在 EF 代码优先中指定不映射到 PK 的复合关系
【发布时间】:2012-02-07 15:24:01
【问题描述】:

asked this ages ago,但这个问题的措辞很糟糕。

我正在尝试指定 2 个类之间的关系,这不是简单的 FK 映射 - 这是一个预先存在的数据库,而不是我将从 EF 生成的东西。

所以,这两个对象的简化视图:

public class WidgetDetails
{

    [Key]
    public int WidgetId { get; set; }

    public int WidgetNumber {get; set;}

    // Some other props here..

    [ForeignKey("WidgetId,WidgetNumber")]
    public virtual WidgetProps WidgetProps { get; set; }


}

public class WidgetProps
{
    [Key]
    public int WidgetPropId { get; set; }

    [Key, Column(Order = 0)]
    public int WidgetId { get; set; }

    [Key, Column(Order = 1)]
    public int WidgetNumber { get; set; }

    // Some props here...
}

这里的关键是 WidgetProps 已经有它自己的 PK。但是 - 因为我希望能够使用复合 WidgetId 和 WidgetNumber 指定 WidgetProps 与 WidgetDetails 相关,所以我尝试在我的 ForeignKey 属性中指定它。

但是,只有当我从 WidgetProps.WidgetPropId 中删除 [KEY] 属性时,这才有效 - 因为在 EF 中,关系是使用键映射的。

我想对EF说的是“嘿,这是PK列,但是这个关系没有使用它,它是基于这2个列”。

这可能吗?

希望这是有道理的!

【问题讨论】:

    标签: c# entity-framework entity-framework-4.1 ef-code-first


    【解决方案1】:

    这是不可能的。 EF 只能创建遵循数据库规则的关系。依赖方的 FK 必须包含主方的 PK 的所有部分。

    一般规则:EF fluent API 无法定义任何您无法在数据库中使用 PK、FK 关系定义的关系。

    【讨论】:

    • 看起来我能做到这一点的唯一方法是添加表示关系的属性并从数据库中获取相关数据。感谢您的澄清!
    猜你喜欢
    • 2011-10-02
    • 2011-12-14
    • 1970-01-01
    • 1970-01-01
    • 2014-08-31
    • 1970-01-01
    • 2020-04-07
    • 1970-01-01
    相关资源
    最近更新 更多