2017-01-30 1 views
0

で代替キーを有効に設定する方法、あなたは(EnableAlternateKeysを呼び出すことで代替キーを可能にすることができる):<strong>Microsoft.AspNet.OData</strong> V5.9.1下でMicrosoft.AspNet.ODataバージョン6

config.EnableAlternateKeys(true); 

このオプションは以下のように他の人と一緒に削除されました:

config.EnableCaseInsensitive(true); 

どのようにしてMicrosoft.AspNet.OData V6の+でのEnableAlternateKeysオプションをオンにしますか?

+0

EnableEnumPrefixFreeメソッドでも同じことが起こりました。最後の1つは、OData githubレポで問題が発生したようです:[link](https://github.com/OData/WebApi/issues/904)。 –

答えて

2

これはOData WebAPI 6で変更されました。v6依存性注入が導入されています(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; 
    } 

まだいくつかの便利なメソッドがあります。ドキュメントから:

あなたはまた、我々はまだ彼らは基本的に取る最初のオーバーロード をラップしているバッチ・ハンドラ、パスハンドラ、HTTP メッセージハンドラなどを取る MapODataServiceRouteの前のオーバーロードを保持することがありますconfigureAction私たちがそれらを保持するのは、 は、ODataサービスとそれに慣れ親しんだAPIに のベアリングを作成するという利便性をユーザに与えたいからです。

あなたは最初の行が何をするか迷っている場合:デフォルトでのOData V6内のすべてのクエリオプションは(再び、docsを参照)無効になっているので、

config.Count().Filter().OrderBy().Expand().Select().MaxTop(null); 

これがあります。それぞれのコントローラ/アクションでそれらを有効にするか、そうしたようにして、それらをグローバルに有効にする必要があります(これは上記の行です)。

+0

上記に示した内容が、モデルのAddAlternateKeyAnnotation機能を再び有効にする方法がわかりません。 –

+0

モデル構築部分はODataサービスの構成とは異なります。あなたの質問は、構成部分についてだけあるようでした。 とにかく、alternateKeyアノテーションを追加するのは以前と同じように機能するはずです。更新された回答を見る –

関連する問題