实体框架不查询派生类 - 错误DbOfType[removed]Entity Framework d

2019-09-18 02:59发布

我有一个基类和两个派生类。

每个派生类的实现相同类型作为属性 - 唯一的区别是属性名称。

可悲的是,我没有在一流的设计多少影响- >他们已经从WSDL文件生成。

然后我对BASETYPE属性封装的共同财产。 该计划是在我的网站的观点等来使用这个属性

我已经使用了著名的“水果例”来说明问题:

 public class FruitBase
    {
        public virtual int ID { get; set; }


        //
        // The plan is to use this property in mvc view
        //
        [NotMapped]
        public virtual FruitnessFactor Fruitness
        {
            get
            {
                if (this.GetType().BaseType == typeof(Apple))
                    return ((Apple)this).AppleFruitness;
                else if (this.GetType().BaseType == typeof(Orange))
                    return ((Orange)this).OrangeFruitness;
                else
                    return null;
            }
        }
    }

public class FruitnessFactor { }

在我的MVC控制器,下面的查询工作绝对没问题:

return View(context.FruitEntities
                           .OfType<Apple>().Include(a =>a.AppleFruitness)
                           .ToList());

但是这一次没有:

  return View(context.FruitEntities
                                   .OfType<Apple>().Include(a =>a.AppleFruitness)
                                   .OfType<Orange>().Include(o => o.OrangeFruitness)
                                   .ToList());

该错误消息我得到的是:

DbOfTypeExpression需要用与类型参数兼容的多态结果类型的表达式参数。

我使用EF 5.0 RC和代码优先的方法。

任何帮助深表感谢!

Answer 1:

至于我可以告诉你不能将Include在一个单一的数据库查询多个亚型。 可以通过查询一个类型( OfType<Apple>().Include(a => a.AppelFruitness)和相同的另一子类型。 问题是,你不能Concat的在同一个查询的结果,因为结果集具有不同的泛型类型(苹果和橘子)。

一种选择是运行两个查询和结果集复制到基本类型的新的集合 - 因为你已经在你的问题下的注释部分显示。

另一种选择(这将只需要一个查询)是一个投影。 你必须定义一个投影类型(你也可以投射到一个匿名类型)...

public class FruitViewModel
{
    public FruitBase Fruit { get; set; }
    public FruitnessFactor Factor { get; set; }
}

...然后可以使用查询:

List<FruitViewModel> fruitViewModels = context.FruitEntities
    .OfType<Apple>()
    .Select(a => new FruitViewModel
    {
        Fruit = a,
        Factor = a.AppleFruitness
    })
    .Concat(context.FruitEntities
    .OfType<Orange>()
    .Select(o => new FruitViewModel
    {
        Fruit = o,
        Factor = o.OrangeFruitness
    }))
    .ToList();

如果你没有禁用更改跟踪(通过使用AsNoTracking )当实体获得附加到上下文导航性能得到自动填充(“关系修正”),这意味着你可以提取视图模型收集的水果...

IEnumerable<FruitBase> fruits = fruitViewModels.Select(fv => fv.Fruit);

......你会得到的成果包括 FruitnessFactor性能。

此代码是非常尴尬的,但没有使用投影直接的办法已经被问了好几次都没有成功:

  • 瓶颈使用实体框架继承
  • 实体框架-子类相关的对象预先加载
  • 如何做我深深渴望负载到持久基本类型的实例(实体框架4)参考实体


文章来源: Entity Framework doesn't query derived classes - Error in DbOfTypeExpression