2017-01-30 10 views
0

В Microsoft.AspNet.OData V5.9.1 и ниже, вы можете позволить альтернативные ключи по телефону EnableAlternateKeys() в WebApiConfig.cs как так установить:Как включить альтернативные ключи с Microsoft.AspNet.OData версии 6

config.EnableAlternateKeys(true); 

Эта опция была удалена вместе с другими, как:

config.EnableCaseInsensitive(true); 

Как вы включите опцию EnableAlternateKeys на в Microsoft.AspNet.OData V6 +?

+0

То же самое произошло с методом EnableEnumPrefixFree. Для последнего, похоже, проблема возникла в репозитории gitub OData: [link] (https://github.com/OData/WebApi/issues/904). Вы также можете прокомментировать там –

ответ

2

Это было изменено в 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). Вы должны либо включить их на каждом контроллере/действии, либо сделать так, как я, и включить их в глобальном масштабе (что и делает вышеприведенная строка).

+0

Я не вижу, как то, что вы показали выше, снова включает функциональность AddAlternateKeyAnnotation для моделей. –

+0

Обратите внимание, что часть построения модели отличается от конфигурации службы OData. Ваш вопрос, казалось, касался только части конфигурации. В любом случае добавление аннотации alternateKey должно работать так же, как и раньше. См. Обновленный ответ –