使用Include方法在EntityFramework中加载相关对象

时间:2012-02-23 12:09:05

标签: c# .net entity-framework

以下是我的实体框架模型的一部分。您会注意到我有一个“标题”表,它与许多“AssetHolding”记录有关,这些记录本身可以是3种类型之一 - 我使用继承(TpH)。 请忽略所有3种继承类型看起来相同的事实 - 这是故意的

Entity model

编辑此数据时,我需要通过Id和所有相关的AssetHoldings拉出一个特定的标题。这样做的方法如下:

public AssetValuationHeader GetValuationHeaderById(int id)
{
    return this.AssetValuationHeaders
        .Include("AssetHoldings")
        .Where(vh => vh.Id == id)
        .FirstOrDefault();
}

这样可以正确加载上图中红色边框突出显示的所有内容。

我遇到的问题是我需要在上图中加载以绿色边框突出显示的位。正如您所看到的,这只与3个继承表中的一个相关。

我试过了:

public AssetValuationHeader GetValuationHeaderById(int id)
{
    return this.AssetValuationHeaders
        .Include("AssetHoldings")
        .Include("AssetHoldings.SwapAssetHoldingNotionals")
        .Where(vh => vh.Id == id)
        .FirstOrDefault();
}
  

指定的包含路径无效。 EntityType   'CoreValuationModel.AssetHolding'未声明导航   名为'SwapAssetHoldingNotionals'的属性。

使用Include方法甚至可以实现这一点吗? (即,不使用LazyLoading)任何解决方法,如果没有?

1 个答案:

答案 0 :(得分:1)

杰米

[剧透] - 这是从完整内存编码的,可能根本不会编译!!

无论如何,我已经遇到过这样的情况:我必须加载几层深度的图表,并且似乎记得按照以下几点做了一些事情:

public AssetValuationHeader GetValuationHeaderById(int id)
{
    return this.AssetValuationHeaders
        .Include("AssetHoldings")
        .Include("AssetHoldings").Select(sa => sa.SwapAssetHoldingNotionals)
        .Where(vh => vh.Id == id)
        .FirstOrDefault();
}

或:

public AssetValuationHeader GetValuationHeaderById(int id)
{
    return this.AssetValuationHeaders
        .Include("AssetHoldings")
        .Include("AssetHoldings").Include("SwapAssetHoldingNotionals")
        .Where(vh => vh.Id == id)
        .FirstOrDefault();
}

正如我所说的那样,不要拍摄信使(这将远离我的电话'电话'稍后)