Почему мой идентификатор OData V4 не работает в моей службе данных ASP.NET?

У меня возникла проблема с использованием моей службы OData V4 в ASP.NET при использовании целочисленных ключей. Я не использую Entity Framework, так как получаю данные из службы SOAP.

Вот мой класс данных:

public class RecipeDto
{
    public RecipeDto();
    public RecipeDto(string name);
    public RecipeDto(int ident);

    public string Description { get; set; }
    public int Ident { get; set; }
    public string Name { get; set; }
    public List<RecipeVersionDto> Versions { get; set; }
}

И я установил свой ключ с помощью свободного API:

var rtdto = builder.EntitySet<RecipeTemplateDto>("AgentConfigTemplates").EntityType
                .HasKey(r => r.Ident)
                .HasMany(r => r.Versions);

Вот мои метаданные в моем сервисе:

<EntityType Name="RecipeTemplateDto">
<Key>
<PropertyRef Name="Ident"/>
</Key>
<Property Name="Ident" Type="Edm.Int32" Nullable="false"/>
<Property Name="Description" Type="Edm.String"/>
<Property Name="Name" Type="Edm.String"/>
<NavigationProperty Name="Versions" Type="Collection(Ifmdatalink.Linerecorder.Backend.PlugIn.dto.RecipeTemplateVersionDto)"/>
</EntityType>

Теперь я ожидаю получить первую запись моего набора сущностей, используя этот запрос:

GET http://localhost:13917/my.svc/AgentConfigTemplates(1)

Но я всегда получаю полный список.

Почему это происходит и как я могу получить первую запись?

Должен ли я как-то расширять свой контроллер odata?

Если я помещу свой ключ в кавычки, я получу неверный ответ на запрос.


person Hans Bäuml    schedule 01.12.2016    source источник


Ответы (1)


Ответа нет ни в модели, ни в свободном определении API. Это проблема контроллера. Контроллер OData должен реализовать два метода get:

public async Task<IQueryable<AgentVersionDto>> Get()

public SingleResult<AgentDto> Get([FromODataUri] int key)

Это охватывает получение всего набора сущностей и одной записи. Если последнее не реализовано, служба odata в webapi 2 всегда будет возвращать весь список.

person Hans Bäuml    schedule 15.01.2017