繁体   English   中英

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

[英]Creating entity relationship with renamed fields and non-primary key in primary table

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

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; }

}

除了相关的信息,字段,导航等,我已经删除了所有这个例子; 希望不要太多。

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

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

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

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

  • 主要关键表 :患者,字段: PatGUID (更名为PatientGUID)

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM