2014-10-08 14 views
8

Używam ODataConventionModelBuilder zbudować model dla EDM Web API OData obsługa jak ten:Jak zapobiec ODataConventionModelBuilder, aby automatycznie odsłonić wszystkie metadane typów wyprowadzonych?

ODataModelBuilder builder = new ODataConventionModelBuilder(); 

builder.Namespace = "X"; 

builder.ContainerName = "Y"; 

builder.EntitySet<Z>("Z"); 

IEdmModel edmModel = builder.GetEdmModel(); 

klasy Z znajduje się w jednym zespole, a tam jest publicznego klasa Q pochodzi od Z znajduje się w innym zestawie.

ODataConventionModelBuilder będzie generuje EDM modelu że zawiera definicję klasy Q (wśród innych klas pochodne) i będzie narażony metadanych usług. Jest to niepożądane w naszym przypadku.

Jeśli klasa pochodna jest niedostępna (na przykład zdefiniowana jako wewnętrzna), to na pewno nie istnieje.

Czy istnieje sposób wymuszenia ODataConventionModelBuilder, aby NIE automatycznie eksponować metadane wszystkich wyprowadzonych typów?

Odpowiedz

8

To powinno działać:

ODataConventionModelBuilder builder = new ODataConventionModelBuilder(); 

builder.Namespace = "X"; 

builder.ContainerName = "Y"; 

builder.EntitySet("Z"); 

builder.Ignore<Q>(); 

IEdmModel edmModel = builder.GetEdmModel(); 
+0

Działa jak urok, dziękuję! Jak mogę tego nie zauważyć ... –

+1

Nie wyklucza to automatycznego wykrywania. Mam tuziny dziedziczonych bytów, ignorowanie każdego z nich indywidualnie jest niepraktyczne i kończy się błędem "sekwencja zawiera wiele elementów". – Jerther

+0

Jest to zgodne z projektem: https://aspnetwebstack.codeplex.com/workitem/1928 – Jerther

4

Nie ma mowy o wyłączeniu automatycznego wykrywania i jest to zgodne z projektem. Zobacz here.

Istnieje jednak obejście. Musisz jawnie zignorować każdy wyprowadzony typ, a następnie przystąpić do ręcznego mapowania każdego wyprowadzonego typu. Oto miły pętla ignorować typy pochodne:

var builder = new ODataConventionModelBuilder(); 
builder.Namespace = "X"; 
builder.ContainerName = "Y"; 
builder.EntitySet<Z>("Z"); 

var types = AppDomain.CurrentDomain.GetAssemblies() 
    .SelectMany(a => a.GetTypes()) 
    .Where(t => t.IsSubclassOf(typeof(Z))); 

foreach (var type in types) 
    builder.Ignore(types.ToArray()); 

//additional mapping of derived types if needed here 

var edmModel = builder.GetEdmModel(); 

Zobacz my blog post więcej szczegółów.

+0

wygląda na to, że nie używamy pętli foreach jako budowniczej.Ignore() akceptuje tablicę. – Rahul

Powiązane problemy