【问题标题】:Entity Framework: Adding a scalar property which is equal to a FK id实体框架:添加一个等于 FK id 的标量属性
【发布时间】:2009-11-23 23:10:32
【问题描述】:

小问题:

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

到目前为止我尝试做的事情:

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

现在我明白它为什么这样做了,但我需要一些为什么能够拥有一个自动填充 ChildId 的标量属性。

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

我意识到我可以编写一个类似于以下内容的 linq 查询(我已经实现了部分类的另一半并在那里添加了一个名为 ChildId 的属性):

from x in db.Parent
select new Parent { ParentName = x.ParentName, ..., ChildId = x.Child.ChildId }

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

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

var childId = parent.Child.Id;

但这会导致触发额外的查询,或者如果我主动加载孩子,在任何一种情况下,当我只想要 ID 时,我会提取比我需要的更多的数据......

所需的最终结果:

那么我该如何绕过这些限制,以便我可以像这样(或非常相似的东西)编写我的查询:

from x in db.Parent
select x

并拥有它,以便我可以去:

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; 

也感谢创建扩展属性的想法......将非常有用。

【问题讨论】:

    标签: c# .net linq entity-framework foreign-keys


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-26
      • 2011-04-27
      • 1970-01-01
      • 1970-01-01
      • 2015-06-21
      相关资源
      最近更新 更多