使用主表中的重命名字段和非主键创建实体关系

时间:2013-03-12 02:12:14

标签: c# entity-framework foreign-keys data-annotations

以下是我试图定义外键关系的两个部分表。

public class Form
{
    [Key, Column("FormID")]
    public System.Guid FormGUID { get; set; }

    [Column("PatGUID")]
    public Nullable<System.Guid> PatientGUID { get; set; }
}

public class Patient
{
    [Column("PatGUID")]
    public System.Guid PatientGUID { get; set; }

    [Key, Column("PatID")]
    public int PatientID { get; set; }

}

我已经删除了除了相关信息,字段,导航等之外的所有内容,希望不要太多。

我们有一个表格表格,FK为PatGUID到患者表格,其中包含字段PatGUID。 Patient表有一个PatID int KEY字段。

我们要求为代码第一实体模型重命名字段;此示例中需要更改的相关字段PatGUID已更改为PatientGUID

我遇到的困难是尝试使用注释或流利来定义此外键。

所以我需要的最终结果是:

  • 主要密钥表:患者,字段:PatGUID(已更名为PatientGUID)

  • 外键表:表单,字段:PatGUID(已重命名为PatientGUID)

这似乎不应该造成大问题,但Patient.PatGUID不是主键并且PatGUID字段被重命名为PatientGUID的组合未启用WCF数据服务正确创建具有适当引用的引用,从而正确选择/加入:

SELECT … FROM  [dbo].[Form] AS [Extent1]
INNER JOIN [dbo].[Patient] AS [Extent2] ON [Extent1].[PatGUID] = [Extent2].[PatGUID]

1 个答案:

答案 0 :(得分:15)

EF还不支持主体密钥不是主键但其他列具有唯一键约束的关系。它是on the feature request list,但未在下一版本(EF 6)的路线图中实施,也未实施。如果它完全实现(可能在EF 7中),则需要等待一年或更长时间才能生产。

在您的特定模型中,EF根本无法识别FormPatient之间的任何关系,因为Patient.PatientID被标记为[Key],而不是Patient.PatientGUID,和EF将Form.PatientGUID视为普通的标量属性,而不是Patient的FK。

理论上,您可以伪造Patient.PatientGUID作为模型中的[Key]属性,但如果您不是从数据库或数据库中创建模型,则它不是数据库中的主键。代码优先模型,即,如果您手动在模型和(现有)数据库之间进行映射。但我不确定这是否会在其他地方引起微妙的问题。

如果您想要提取join和相关的Patients,可以选择在LINQ中编写手动Forms语句。然后,您可以使用任意属性连接两个实体,而不仅仅是关键属性。在我看来,这是更清洁,更少“棘手”的方法。但是,缺点是您不会在PatientForm之间拥有导航属性 - 引用或集合,并且您无法使用诸如急切加载(Include)之类的功能,延迟加载或LINQ查询中的“虚线路径语法”(如Form.Patient.SomePatientProperty等)。