以下是我试图定义外键关系的两个部分表。
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]
答案 0 :(得分:15)
EF还不支持主体密钥不是主键但其他列具有唯一键约束的关系。它是on the feature request list,但未在下一版本(EF 6)的路线图中实施,也未实施。如果它完全实现(可能在EF 7中),则需要等待一年或更长时间才能生产。
在您的特定模型中,EF根本无法识别Form
和Patient
之间的任何关系,因为Patient.PatientID
被标记为[Key]
,而不是Patient.PatientGUID
,和EF将Form.PatientGUID
视为普通的标量属性,而不是Patient
的FK。
理论上,您可以伪造Patient.PatientGUID
作为模型中的[Key]
属性,但如果您不是从数据库或数据库中创建模型,则它不是数据库中的主键。代码优先模型,即,如果您手动在模型和(现有)数据库之间进行映射。但我不确定这是否会在其他地方引起微妙的问题。
如果您想要提取join
和相关的Patients
,可以选择在LINQ中编写手动Forms
语句。然后,您可以使用任意属性连接两个实体,而不仅仅是关键属性。在我看来,这是更清洁,更少“棘手”的方法。但是,缺点是您不会在Patient
和Form
之间拥有导航属性 - 引用或集合,并且您无法使用诸如急切加载(Include
)之类的功能,延迟加载或LINQ查询中的“虚线路径语法”(如Form.Patient.SomePatientProperty
等)。