【问题标题】:asp.net entity framework: casting of inheritance proxiesasp.net 实体框架:继承代理的铸造
【发布时间】:2013-04-11 16:12:01
【问题描述】:

由于实体框架创建代理而不是提供“原始”实体类,您如何将父类转换为子类? 这不是“正常方式”,因为自动创建的代理类不使用原始实体类的继承结构。

关闭代理创建功能对我来说不是一个选项。

欢迎任何帮助,谢谢!

【问题讨论】:

  • 您能否提供一些示例代码来说明失败的原因以及您收到的错误?我从来没有遇到过将代理对象转换为非代理对象的问题。
  • 好吧,我想将父代理对象转换为子对象。由于不知道对应的child-proxy-class,所以只好使用原来的child class。此强制转换导致 InvalidCastException。
  • 继承链依然完好。您无需弄清楚“子”代理类是什么。您可能做错了什么,但如果没有示例代码,就很难准确判断您做错了什么。

标签: asp.net entity-framework inheritance casting proxy-classes


【解决方案1】:

如何将父类转换为子类?

如果实际运行时类型子级,您只能将父级强制转换为子级。对于非代理和代理来说都是如此,因为子代的代理源自子代,因此它子代。父母的代理不是孩子,因此您不能将其投射给孩子,也不能将父母投射给孩子。

例如(使用DbContext API):

public class Parent { ... }
public class Child : Parent { ... }

那么以下两种转换都将起作用:

Parent parent1 = context.Parents.Create<Child>(); // proxy
Parent parent2 = new Child();                     // non-proxy

Child child1 = (Child)parent1; // works
Child child2 = (Child)parent2; // works

以下两个都不起作用:

Parent parent1 = context.Parents.Create<Parent>(); // proxy
Parent parent2 = new Parent();                     // non-proxy

Child child1 = (Child)parent1; // InvalidCastException
Child child2 = (Child)parent2; // InvalidCastException

两种演员都“以正常方式”工作。

【讨论】:

  • 好的,这解释了我的问题。我想要的是: Child child2 = (Child)parent2; // InvalidCastException 这种事情变得复杂了,因为你不能只创建父级并分配值,然后检查它是否是子级并分配子级的字段。
  • @Cleo:嗯,你可以使用 is 运算符来检查它是否是一个孩子:if (parent1 is Child) ...
猜你喜欢
  • 2011-10-18
  • 1970-01-01
  • 2011-05-19
  • 2010-10-07
  • 1970-01-01
  • 2011-08-01
  • 2013-01-25
相关资源
最近更新 更多