11

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

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

}

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

我们有一个表格表格,带有一个 FKPatGUID到一个带有字段的 Patient 表格PatGUID。Patient 表有一个PatIDint KEY 字段。

我们需要为代码优先实体模型重命名字段;此示例中需要更改的相关字段PatGUID正在更改为PatientGUID.

我遇到的困难是尝试使用注释或流利的方式定义这个外键。

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

  • 主键表:患者,字段:(PatGUID重命名为 PatientGUID)

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

这似乎不会造成大问题,但是由于Patient.PatGUID不是主键和PatGUID重命名为的字段的组合, PatientGUIDWCF 数据服务无法正确创建具有正确引用的引用,因此是正确的选择/连接的:

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

1 回答 1

16

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

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

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

join如果你想获取Patients和相关的,另一种方法是在 LINQ 中编写手动语句Forms。然后,您可以使用任意属性连接两个实体,而不仅仅是关键属性。在我看来,这是一种更干净、更不“棘手”的方法。然而,缺点是你不会在Patient和之间有导航属性——引用或集合——Form你不能在你的LINQ 查询。IncludeForm.Patient.SomePatientProperty

于 2013-03-12T22:01:56.710 回答