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

2023-12-31

以下是我尝试在其中定义外键关系的两个部分表。

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,FK 为PatGUID到带有字段的 Patient 表PatGUID。 病人表有一个PatIDint 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]

EF 尚不支持主体键不是主键而是具有唯一键约束的其他列的关系。这是在功能请求列表中 http://data.uservoice.com/forums/72025-entity-framework-feature-suggestions/suggestions/1050579-unique-constraint-i-e-candidate-key-support但既没有实施,也没有列入下一个版本 (EF 6) 的路线图。如果它得到实现(可能在 EF 7 中),预计需要等待一年或更长时间才能准备好投入生产。

在您的特定模型中,EF 无法识别之间的任何关系Form and Patient完全因为Patient.PatientID被标记为[Key], not Patient.PatientGUID和 EF 治疗Form.PatientGUID作为普通标量属性,而不是作为 FKPatient.

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

另一种方法是编写手册joinLINQ 中的语句(如果您想获取)Patients以及相关的Forms。然后,您可以使用任意属性(而不仅仅是关键属性)连接两个实体。在我看来,这是更干净、更不“棘手”的方法。但是,缺点是您不会在之间具有导航属性 - 引用或集合Patient and Form并且您不能使用诸如预加载之类的功能(Include)、延迟加载或舒适的“点路径语法”(例如Form.Patient.SomePatientProperty等)在 LINQ 查询中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐