【发布时间】:2012-06-15 03:43:26
【问题描述】:
我有一个基类和两个派生类。
每个派生类都实现了与属性相同的类型 - 唯一的区别是属性名称。
遗憾的是,我对类设计没有太大影响 -> 它们是从 wsdl 文件生成的。
然后我在 BaseType 上有一个属性来封装公共属性。计划是在我的网络视图等中使用此属性。
我用著名的“Fruit-Example”来演示这个问题:
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 和 Code First 方法。
非常感谢任何帮助!
【问题讨论】:
-
这可能是因为您的表达暗示
Orange是Apple -
我会认为通过将我的 FruitEntities 定义为
DbSet<FruitBase> FruitEntities表达式意味着橙子和苹果是水果?! -
OfType链说:“从 FruitEntities 过滤所有苹果,然后从结果中过滤所有橙子的苹果”,这仅在橙子是苹果时才有意义,即Orange类继承自Apple班级。你想用那个查询实现什么?橙子和苹果的组合列表,即所有苹果或橙子的水果? -
我想将所有水果的列表返回到视图,然后显示 FruitBase.FruitnessFactor。我可以看到
OfType在这种情况下没有意义。 “手动”替代方法是先查询橙子,然后再查询苹果,将两者合并到 List中。这似乎可行,但代码有异味 -
其实闻起来是手动查询子类型。依靠多态才是正道。
标签: entity-framework linq-to-entities ef-code-first polymorphism entity-framework-5