DCSIMG
Entity Framework doesn’t support web services + entity inheritance - Ido Flatow's Blog Veni Vidi Scripsi

Ido Flatow's Blog

Veni Vidi Scripsi

News

Have you heard me speak?
Powered
<style type='text/css' media='screen' id='sm_css'> #smix {overflow: visible;height: auto;border-radius: 10px;max-width: 250px;background-color: #323232;text-align: left;font-size: 12px;line-height: 16px;font-family:'Lucida Sans Unicode','Lucida Grande',Verdana,Arial,Helvetica,sans-serif;-webkit-border-radius: 10px;-moz-border-radius: 10px;border-radius: 10px;} #smix a {color: #0056CC;text-decoration: none;} #smix .sm_head {color: #fff; line-height: 1em;font-size: 1.4em;padding: 10px;color: #fff;} #smix .sm_lanyard_wrapper {background-color: #fff;;clear: both;width: 97%;margin: 0 auto;margin-bottom: 0px;} #smix .sm_lanyard_content {padding: 7px;}#smix button.sm_rec, #smix a.sm_rec, #smix input[type=submit].sm_rec { padding: 6px 10px; -webkit-border-radius: 2px 2px;-moz-border-radius: 2px; border-radius: 2px; border: solid 1px rgb(153, 153, 153); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgb(255, 255, 255)), to(rgb(221, 221, 221))); color: #333; text-decoration: none; cursor: pointer; display: inline-block; text-align: center; text-shadow: 0px 1px 1px rgba(255,255,255,1); line-height: 1; }#smix .sm_rec:hover { background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgb(248, 248, 248)), to(rgb(221, 221, 221))); }#smix .sm_rec:active { background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgb(204, 204, 204)), to(rgb(221, 221, 221))); }#smix .sm_rec.medium { padding: 3px 7px; font-size: 13px; }#smix .sm_rec span.icon.thumbs_up {background-position: 0px 36px;vertical-align: text-top;display: inline-block;margin-right: 4px;height: 18px;width: 16px;background-image: url(http://speakermix.com/images/new/thumbsold.png);}#smix .sm_rec:hover span.icon.thumbs_up {background-position: 0px 18px;} #smix .sm_events {padding:2px 0px 4px 0px;} #smix .sm_section {font-size: 10px; border-bottom: 1px solid silver; margin-bottom: 6px;} #smix .sm_subline {font-size:120%;margin-top:4px;font-weight:bold} #smix .powered {text-align: right} #smix .powered img {margin: 7px} </style>
Sela Technology Center

Advertisement

Entity Framework doesn’t support web services + entity inheritance

Entity Framework supports entity inheritance, which is a basic requirement for O/R mappers.

When exposing a model through a service, either an ASMX WS or a WCF service, a WSDL will be created that among other things describes the structure of the entities, including the inheritance tree of the entities - This is done to allow creation of methods that return polymorphic types.

EF supports derived entities through WCF services with data contract serialization using the KnownTypeAttribute which is added to the base class for every derived class.

To allow the same thing to be done with ASMX web services (that uses the XmlSerializer) a XmlIncludeAttribute needs to be added to the base class for every derived class – something that EF doesn’t do !!!

Without XmlIncludeAttribute, the WSDL will not include information about the derived classes, making the generated proxy in the client accept only base class values, and worse – get a soap exception when a derived type is returned from the service.

The solution for this is simple, yet annoying :

Simple - create a partial class for every base class and add an XmlIncludeAttribute for each derived class. For example, if you have a Person base class and a derived Employee class then the partial class will look like this:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Serialization;

namespace EFSample
{
    [XmlInclude(typeof(Employee))]
    public partial class Person 
    {
    }
}

Annoying – since it’s that simple, why doesn’t EF support that?

Comments

Ariel Ben Horesh said:

what to do? it is always like that with beta products.

Oops right, it is v1. :/

sorry my mistake

# November 22, 2008 8:18 AM
Leave a Comment

(required) 

(required) 

(optional)

(required) 


Enter the numbers above: