Search code examples
asp.netentity-frameworkinheritancecastingproxy-classes

asp.net entity framework: casting of inheritance proxies


Since the Entity Framework creates proxy instead of providing the "original" entity classes, how do you cast a parent class to a child class? This does not work "the normal way" because the automatically created proxy classes don't use the inheritance structure of the original entity classes.

Turning off the proxy-creation feature is not an option for me.

Any help is welcome, thanks!


Solution

  • How do you cast a parent class to a child class?

    You can only cast a parent to a child if the actual runtime type is a child. That's true for non-proxies and proxies because a proxy of a child derives from a child, hence it is a child. A proxy of a parent is not a child, so you can't cast it to a child, neither can you cast a parent to a child.

    For example (using DbContext API):

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

    Then both the following casts will work:

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

    And both the following won't work:

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

    Both casts work "the normal way".