以下是我尝试在其中定义外键关系的两个部分表。
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
。
病人表有一个PatID
int KEY 字段。
我们需要为代码优先实体模型重命名字段;本例中需要更改的相关字段是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]
属性在模型中,尽管它不是数据库中的主键,如果您不从数据库创建模型或从代码优先模型创建数据库,也就是说,如果您手动在模型和(现有)数据库之间进行映射。但我不确定这是否不会在其他地方引起微妙的问题。
另一种方法是编写手册join
LINQ 中的语句(如果您想获取)Patients
以及相关的Forms
。然后,您可以使用任意属性(而不仅仅是关键属性)连接两个实体。在我看来,这是更干净、更不“棘手”的方法。但是,缺点是您不会在之间具有导航属性 - 引用或集合Patient
and Form
并且您不能使用诸如预加载之类的功能(Include
)、延迟加载或舒适的“点路径语法”(例如Form.Patient.SomePatientProperty
等)在 LINQ 查询中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)