1

我有以下 POCO(使用 Code First 和 EF 6.0.0 alpha 3):

public class RevBase
{
    [Key]
    public int Id{ get; set; }
}

public class ItemBase
{
    [Key]
    public int Id { get; set; }

    public List<RevBase> Revs { get; set; }
}

public class RevDev : RevBase
{
    public string Content { get; set; }
}

public class ItemDev : ItemBase
{
    public string Title { get; set; }
}

以及以下上下文

public class MyContext : DbContext
{
    DbSet<ItemDev> Items { get; set; }
}

现在我想查询context.Items.Include(i => i.Revs)但以某种方式告诉 EF 它应该将 Revs 加载为RevDevnot RevBase

这是可能的还是我需要加载它们RevBase并进行另一个查询以获取相应的RevDev实例?

我尝试的另一种方法是从RevDevto创建第二个关系ItemDev,但随后 EF 还在数据库中创建了第二个外键列,这并不是真正必要的......

4

2 回答 2

1

将 Revs 加载为 RevDev 而不是 RevBase

如果给定RevBase的不是 a RevDev,则不能将其加载 RevDev. (不是每一种动物都是狗。你不能把每一种动物都变成狗,有些是猫。)

实际上,我认为您需要的是按类型过滤,这在使用时通常会出现问题,Include因为它根本不支持任何过滤。我看到你有两个选择:

  • 使用显式加载(支持过滤):

    var items = context.Items.ToList();
    foreach (var item in items)
        context.Entry(item).Collection(i => i.Revs).Query()
            .Where(r => r is RevDev)
            .Load();
    

    这些是 1 + N 个单独的数据库查询。

  • 使用投影:

    var items = context.Items
        .Select(i => new
        {
            Item = i,
            RevDevs = i.Revs.Where(r => r is RevDev)
        })
        .AsEnumerable()
        .Select(a => a.Item)
        .ToList();
    

    这只是一个数据库查询。自动关系修复应Item.Revs使用已加载的RevDevs.

于 2013-03-10T13:18:26.690 回答
0

刚刚发现实体框架默认情况下会这样做。我的代码中有另一个错误,为什么它不起作用......

于 2013-03-10T13:12:36.053 回答