Почему мой метод служб данных WCF не отображается в списке коллекций OData? - PullRequest
3 голосов
/ 11 февраля 2011

Когда я просматриваю корень моей службы данных WCF (http://localhost/MyService.svc/) в браузере, я вижу это:

<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 
<service xml:base="http://localhost/MyService.svc/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:app="http://www.w3.org/2007/app" xmlns="http://www.w3.org/2007/app">
<workspace>
<atom:title>Default</atom:title> 
</workspace>
</service>

Я ожидаю увидеть список коллекций.

Когда я перехожу на $metadata URL, я вижу это:

<?xml version="1.0" encoding="iso-8859-1" standalone="yes"?>
<edmx:Edmx Version="1.0" xmlns:edmx="http://schemas.microsoft.com/ado/2007/06/edmx">
      <edmx:DataServices xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" m:DataServiceVersion="1.0">
        <Schema Namespace="MyApp" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://schemas.microsoft.com/ado/2007/05/edm">
          <ComplexType Name="Package">
            <Property Name="Id" Type="Edm.String" Nullable="true" />
          </ComplexType>
        </Schema>
        <Schema Namespace="MyApp" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://schemas.microsoft.com/ado/2007/05/edm">
          <EntityContainer Name="PackageService" m:IsDefaultEntityContainer="true">
            <FunctionImport Name="GetQueryablePackages" ReturnType="Collection(MyApp.Package)" m:HttpMethod="GET" />
          </EntityContainer>
        </Schema>
      </edmx:DataServices>
    </edmx:Edmx>

Почему моя коллекция GetQueryablePackages может не отображаться?

Я использую следующие настройки доступа:

config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
config.SetServiceOperationAccessRule("*", ServiceOperationRights.All);

Ответы [ 3 ]

1 голос
/ 11 февраля 2011

Сервисные операции (функция импорта в EDM) не представлены в сервисном документе. Здесь представлены только наборы сущностей. Если вы хотите, чтобы ваши данные были представлены в сервисном документе, сделайте из них сущность. В зависимости от модели провайдера это отличается. Обычно это означает предоставление свойства типа IQueryable вашему классу контекста. Обратите внимание, что T должен быть типом сущности (должен иметь ключ).

1 голос
/ 11 февраля 2011

Можете ли вы поделиться определением контекста, в котором вы определили свойства IQueryable <>.Мне приходят на ум две вещи: во-первых, свойства должны иметь тип IQueryable <> или какой-то тип, который происходит от него.Во-вторых, тип элемента, на который ссылается IQueryable <>, должен быть типом сущности, т. Е. В них должны быть объявлены ключевые свойства.

Надеюсь, это поможет.

Спасибо Pratik

0 голосов
/ 03 мая 2012

Или вы можете создать метод расширения следующим образом:

public static class TestEntitiesExtensions
{
    public static IEnumerable<Package> GetQueryablePackages(this TestEntities context)
    {
        var uri = new Uri(context.BaseUri, "GetQueryablePackages");
        return context.Execute<Package>(uri);
    }
}
...