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


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

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]

3711
2018-03-12 02:12


起源



答案:


EF还不支持主体密钥不是主键但其他列具有唯一键约束的关系。它是 在功能请求列表上 但既未实施也未在下一版本的路线图上实施(EF 6)。如果它完全实现(可能在EF 7中),则期望等待一年或更长时间,直到它准备好生产。

在您的特定模型中,EF无法识别任何关系 Form 和 Patient 因为 Patient.PatientID 被标记为 [Key]不是 Patient.PatientGUID和EF对待 Form.PatientGUID 作为一个普通的标量财产,而不是作为FK的 Patient

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

另一种方法是编写手册 join LINQ中的语句,如果你想获取 Patients 和相关的 Forms。然后,您可以使用任意属性连接两个实体,而不仅仅是关键属性。在我看来,这是更清洁,更少“棘手”的方法。但是,缺点是您之间不会有导航属性 - 引用或集合 Patient 和 Form 而你不能使用像渴望加载的功能(Include),延迟加载或舒适的“虚线路径语法”(如 Form.Patient.SomePatientProperty在您的LINQ查询中。


14
2018-03-12 22:01



不完全是我想听到的,但至少是一个明确的答案,为什么我不能让这个工作,并知道我需要提出替代解决方案。 - user2144404


答案:


EF还不支持主体密钥不是主键但其他列具有唯一键约束的关系。它是 在功能请求列表上 但既未实施也未在下一版本的路线图上实施(EF 6)。如果它完全实现(可能在EF 7中),则期望等待一年或更长时间,直到它准备好生产。

在您的特定模型中,EF无法识别任何关系 Form 和 Patient 因为 Patient.PatientID 被标记为 [Key]不是 Patient.PatientGUID和EF对待 Form.PatientGUID 作为一个普通的标量财产,而不是作为FK的 Patient

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

另一种方法是编写手册 join LINQ中的语句,如果你想获取 Patients 和相关的 Forms。然后,您可以使用任意属性连接两个实体,而不仅仅是关键属性。在我看来,这是更清洁,更少“棘手”的方法。但是,缺点是您之间不会有导航属性 - 引用或集合 Patient 和 Form 而你不能使用像渴望加载的功能(Include),延迟加载或舒适的“虚线路径语法”(如 Form.Patient.SomePatientProperty在您的LINQ查询中。


14
2018-03-12 22:01



不完全是我想听到的,但至少是一个明确的答案,为什么我不能让这个工作,并知道我需要提出替代解决方案。 - user2144404