2014-10-08 7 views
8

Böyle Web API OData Hizmet için Erezyon Modeli inşa etmek ODataConventionModelBuilder kullanıyorum: Z bir grubunda yer alırnasıl otomatik olarak tüm türetilmiş türleri meta açığa ODataConventionModelBuilder önlemek için?

ODataModelBuilder builder = new ODataConventionModelBuilder(); 

builder.Namespace = "X"; 

builder.ContainerName = "Y"; 

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

IEdmModel edmModel = builder.GetEdmModel(); 

Sınıf ve Z türetilen kamu sınıf Q var Farklı montajda bulunan.

ODataConventionModelBuilder olacak EDM modeli oluşturur (diğer türetilmiş sınıfları arasında) sınıfı Q tanımını ve hizmet meta ile maruz kalacağı içerir. Bu bizim durumumuzda istenmeyen bir durumdur.

ulaşılmaz elde edilen bir sınıfı, bir sorun (örneğin, dahili olarak tanımlanır)

, elbette, mevcut değildir.

otomatik olarak tüm türetilmiş türleri meta maruz OLMAYAN için ODataConventionModelBuilder zorlamak için bir yolu var mı?

cevap

8

Bu çalışması gerekir:

ODataConventionModelBuilder builder = new ODataConventionModelBuilder(); 

builder.Namespace = "X"; 

builder.ContainerName = "Y"; 

builder.EntitySet("Z"); 

builder.Ignore<Q>(); 

IEdmModel edmModel = builder.GetEdmModel(); 
+0

İşleri, teşekkür ederim! Bunu nasıl özleyebilirim ... –

+1

Bu otomatik keşfi engellemez. Ben bireysel olarak pratik değildir ve her durumda bazı "dizisi birden fazla öğesi içeriyor" hatası ile biter bunların her birinin görmezden kalıtsal varlıkları onlarca var. – Jerther

+0

Ve bu tasarım gereğidir: https://aspnetwebstack.codeplex.com/workitem/1928 – Jerther

4

Orada otomatik keşfini devre dışı bırakmanın bir yolu yoktur ve bu tasarım gereğidir. Bakınız here.

Ancak, bir çözüm bulunmamaktadır. Her türetilmiş türü Açık bir şekilde Yoksaymanız ve her türetilmiş türün manuel olarak eşlenmesini sağlamanız gerekir. İşte türetilmiş türlerini görmezden güzel döngü var:

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(); 

fazla ayrıntı için my blog post bakınız. Büyü gibi

+0

, builder.Ignore() dizisi olarak foreach döngüsünün kullanılmasına benzememektedir. – Rahul

İlgili konular