Это было изменено в OData WebAPI 6. Поскольку введена вставка V6 Dependency Injection (см. docs). Это означает, что старый способ настройки вашего сервиса был изменен. Теперь вы должны зарегистрировать все необходимые услуги и маршруты в методе MapODataServiceRoute
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
config.Count().Filter().OrderBy().Expand().Select().MaxTop(null);
setErrorDetailPolicy();
var model = BuildEdmModel();
// Web API routes
config.MapODataServiceRoute("routeName", "routePrefix", builder =>
builder.AddDefaultODataServices()
.AddService<IEdmModel>(ServiceLifetime.Singleton, s => model)
.AddService<IEnumerable<IODataRoutingConvention>>(ServiceLifetime.Singleton, sp => ODataRoutingConventions.CreateDefaultWithAttributeRouting("routeContact", config))
.AddService<ODataUriResolver>(ServiceLifetime.Singleton, s => new AlternateKeysODataUriResolver(model))
);
}
Важным направлением здесь является последним:
.AddService<ODataUriResolver>(ServiceLifetime.Singleton, s => new AlternateKeysODataUriResolver(model))
После этого включается я обнаружил, что моя модель имела проблемы признания способ расширения AddAlternateKeyAnnotation
. Это было решено путем литья экземпляра в EdmModel
(вместо использования IEdmModel
оно было). Мой класс ModelBuilder выглядит примерно так:
internal static IEdmModel GetModel()
{
ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
builder.Namespace = "MyNamespace";
var personsSet = builder.EntitySet<PersonDTO>("Persons");
builder.EntityType<PersonDTO>().HasKey(k => k.Id);
var model = builder.GetEdmModel();
// model is built, add alternateKey annotation as necessary
// first, find entity type
IEdmEntityType t = model.FindDeclaredEntitySet("Persons").EntityType();
// now find the properties we want to use as alternateKey
var firstNameProp = t.FindProperty("FirstName");
var lastNameProp = t.FindProperty("LastName");
// and finally add the annotation
((EdmModel)model).AddAlternateKeyAnnotation(t, new Dictionary<string, IEdmProperty> {
{
"FirstName", firstNameProp
},
{
"LastName", lastNameProp
}
});
return model;
}
Обратите внимание, что все еще есть несколько удобных методов. Из документации:
Вы также можете обнаружить, что мы по-прежнему сохраняют прежние перегруженные MapODataServiceRoute, которые принимают командные обработчики, обработчики путей, обработчики HTTP сообщений и т.д. Они в основном упаковочную первую перегрузку , которая принимает configureAction. Причина, по которой мы их поддерживаем, заключается в том, что мы хотим предоставить пользователям удобство создания OData-сервисов и подшипников API, с которыми они знакомы.
Если вам интересно, что делает первая строка:
config.Count().Filter().OrderBy().Expand().Select().MaxTop(null);
Это происходит потому, что в OData v6 по умолчанию все параметры запроса отключены (опять же, см docs). Вы должны либо включить их на каждом контроллере/действии, либо сделать так, как я, и включить их в глобальном масштабе (что и делает вышеприведенная строка).
То же самое произошло с методом EnableEnumPrefixFree. Для последнего, похоже, проблема возникла в репозитории gitub OData: [link] (https://github.com/OData/WebApi/issues/904). Вы также можете прокомментировать там –