これは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);
これがあります。それぞれのコントローラ/アクションでそれらを有効にするか、そうしたようにして、それらをグローバルに有効にする必要があります(これは上記の行です)。
EnableEnumPrefixFreeメソッドでも同じことが起こりました。最後の1つは、OData githubレポで問題が発生したようです:[link](https://github.com/OData/WebApi/issues/904)。 –