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

use*_*404 11 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; }
Run Code Online (Sandbox Code Playgroud)

}

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

我们有一个表格表格,其中FK为PatGUID带有字段的患者表格PatGUID.Patient表有一个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]
Run Code Online (Sandbox Code Playgroud)

Sla*_*uma 16

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.然后,您可以使用任意属性连接两个实体,而不仅仅是关键属性.在我看来,这是更清洁,更少"棘手"的方法.但是,缺点是,你不会有导航性能-引用或集合-之间PatientForm你不能使用像预先加载(功能Include),延迟加载或舒适的"虚线路径语法"(如Form.Patient.SomePatientProperty,等)在您的LINQ查询.

  • 不完全是我想听到的,但至少是一个明确的答案,为什么我不能让这个工作,并知道我需要提出替代解决方案. (3认同)