C# 实体框架:添加等于FK id的标量属性

C# 实体框架:添加等于FK id的标量属性,c#,.net,linq,entity-framework,foreign-keys,C#,.net,Linq,Entity Framework,Foreign Keys,简短问题: 基本上,我正在尝试向我的实体添加一个标量属性,该属性保存FK实体的ID 到目前为止我一直在尝试的: 到目前为止,我尝试添加标量属性(称为ChildId)并将其映射到数据库中的匹配列。现在,您可以想象,当我尝试这样做时,会出现一些异常,因为实体框架抱怨FK id在两个地方进行管理,一个是通过x.ChildId,另一个是通过x.Child.ChildId 现在我知道它为什么要这样做了,但我需要一些为什么,以便能够有一个自动填充ChildId的标量属性 我知道我可以做但确实不想做的事情:

简短问题:

基本上,我正在尝试向我的实体添加一个标量属性,该属性保存FK实体的ID

到目前为止我一直在尝试的:

到目前为止,我尝试添加标量属性(称为ChildId)并将其映射到数据库中的匹配列。现在,您可以想象,当我尝试这样做时,会出现一些异常,因为实体框架抱怨FK id在两个地方进行管理,一个是通过x.ChildId,另一个是通过x.Child.ChildId

现在我知道它为什么要这样做了,但我需要一些为什么,以便能够有一个自动填充ChildId的标量属性

我知道我可以做但确实不想做的事情:

我意识到我可以编写一个linq查询,它可以执行以下操作(我实现了部分类的另一半,并在其中添加了一个名为ChildId的属性):

但这是非常混乱的,特别是当我有30多个查询返回一个父对象时,需要为每个查询重复此映射

我还意识到,在执行查询后,我可以执行以下操作:

var childId = parent.Child.Id;
但这会导致触发一个额外的查询,或者如果我正在主动加载child,并且在任何一种情况下,当我只需要ID时,我将提取比我需要的更多的数据

所需的最终结果:

那么,我如何绕过这些限制,以便能够像这样编写查询(或类似的内容):

并拥有它,这样我就可以:

var childId = parent.Child.Id;   //Where in this case the only property retrieved would be the Id 
//Or
var childId = parent.ChildId;
干杯 安东尼

编辑:

嘿,谢谢你的回复

我也为自己找到了答案。基本上,我认为如果EF支持延迟加载,那么它必须将ID存储在某个地方。然后它点击,它必须在引用中。。。因此,对我来说,结果是:

destination.PlanTypeId = (int)source.PlanTypeReference.EntityKey.EntityKeyValues[0].Value; 

还感谢您提出的创建扩展属性的想法。。。将非常有用。

是否尝试使用parent.ChildReference.EntityKey?它不需要额外加载,并且保持FK。您可以编写扩展方法以更轻松地获取密钥

var childId = parent.Child.Id;   //Where in this case the only property retrieved would be the Id 
//Or
var childId = parent.ChildId;
destination.PlanTypeId = (int)source.PlanTypeReference.EntityKey.EntityKeyValues[0].Value;