Службы данных WCF (OData), запрос с ограничением наследования? - PullRequest
6 голосов
/ 16 января 2011

Проект: Служба данных WCF, использующая внутренний подход EF4 CTP5 Code-First.

Я настроил сущности с наследованием (TPH). Смотрите предыдущий вопрос по этой теме:

Предыдущий вопрос о нескольких объектах - одна и та же таблица

Сопоставление работает хорошо, а модульное тестирование по EF4 подтверждает, что запросы выполняются гладко.

Мои сущности выглядят так:

  • ContactBase (аннотация)
  • Клиент (наследуется от ContactBase), эта сущность также имеет несколько свойств навигации по отношению к другим сущностям
  • Ресурс (наследуется от ContactBase)

Я настроил дискриминатор, поэтому и клиент, и ресурс сопоставляются с одной и той же таблицей. Опять же, все работает нормально с точки зрения Ef4 (юнит тестирует все зеленые!)

Тем не менее, при представлении этого DBContext через службы данных WCF, я получаю: - Открыты наборы CustomerBases (наборы Customer и Resources кажутся скрытыми, это задумано?) - Когда я запрашиваю Odata для клиентов, я получаю эту ошибку:

Navigation Properties are not supported on derived entity types. Entity Set 'ContactBases' has a instance of type 'CodeFirstNamespace.Customer', which is an derived entity type and has navigation properties. Please remove all the navigation properties from type 'CodeFirstNamespace.Customer'. 

StackTrace:

at System.Data.Services.Serializers.SyndicationSerializer.WriteObjectProperties(IExpandedResult expanded, Object customObject, ResourceType resourceType, Uri absoluteUri, String relativeUri, SyndicationItem item, DictionaryContent content, EpmSourcePathSegment currentSourceRoot)
at System.Data.Services.Serializers.SyndicationSerializer.WriteEntryElement(IExpandedResult expanded, Object element, ResourceType expectedType, Uri absoluteUri, String relativeUri, SyndicationItem target)
at System.Data.Services.Serializers.SyndicationSerializer.<DeferredFeedItems>d__b.MoveNext()
at System.ServiceModel.Syndication.Atom10FeedFormatter.WriteItems(XmlWriter writer, IEnumerable`1 items, Uri feedBaseUri)
at System.ServiceModel.Syndication.Atom10FeedFormatter.WriteFeedTo(XmlWriter writer, SyndicationFeed feed, Boolean isSourceFeed)
at System.ServiceModel.Syndication.Atom10FeedFormatter.WriteFeed(XmlWriter writer)
at System.ServiceModel.Syndication.Atom10FeedFormatter.WriteTo(XmlWriter writer)
at System.Data.Services.Serializers.SyndicationSerializer.WriteTopLevelElements(IExpandedResult expanded, IEnumerator elements, Boolean hasMoved)
at System.Data.Services.Serializers.Serializer.WriteRequest(IEnumerator queryResults, Boolean hasMoved)
at System.Data.Services.ResponseBodyWriter.Write(Stream stream)

Похоже на ограничение услуг WCF Data ... не так ли? В Интернете не так много документации о службах данных WCF (OData) и спецификациях наследования.

Как я могу преодолеть это исключение? Мне нужны эти свойства навигации для производных объектов, и наследование кажется единственным способом обеспечить сопоставление 2 объектов в одной таблице с Ef4 CTP5 ...

Есть мысли?

1 Ответ

2 голосов
/ 26 января 2011

В настоящее время службы данных WCF не поддерживают свойства навигации для производных типов. Это известное ограничение, и в настоящее время мы работаем над тем, чтобы включить его для нашего следующего выпуска.

В настоящее время обходной путь заключается в том, что вы помещаете все свойства навигации в тип, указанный в наборе. В вашем примере, вы можете сделать тип набора сущностей покупателем, а не ContactBase?

Надеюсь, это поможет. Спасибо Pratik

...