2014-10-08 111 views
8

我使用ODataConventionModelBuilder建立EDM模型的Web API OData服務是這樣的:如何防止ODataConventionModelBuilder自動公開所有派生類型的元數據?

ODataModelBuilder builder = new ODataConventionModelBuilder(); 

builder.Namespace = "X"; 

builder.ContainerName = "Y"; 

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

IEdmModel edmModel = builder.GetEdmModel(); 

ž位於一個組件,並且有公共Qž衍生位於不同的組裝。

的ODataConventionModelBuilder意願生成EDM模型包括定義類Q的(其他派生類中),它會與服務元數據被暴露。在我們的情況下這是不可取的。

當派生類不可訪問(例如定義爲內部)這樣的問題當然不存在。

是否有辦法強制ODataConventionModelBuilder不會自動公開所有派生類型的元數據?

回答

8

這應該工作:

ODataConventionModelBuilder builder = new ODataConventionModelBuilder(); 

builder.Namespace = "X"; 

builder.ContainerName = "Y"; 

builder.EntitySet("Z"); 

builder.Ignore<Q>(); 

IEdmModel edmModel = builder.GetEdmModel(); 
+0

工程就像一個魅力,謝謝!我怎麼能錯過這個... – 2014-10-09 08:30:25

+1

這並不妨礙自動發現。我有幾十個繼承的實體,單獨忽略它們中的每一個都是不切實際的,並且最終以一些「序列包含多個元素」錯誤爲代價。 – Jerther 2015-01-07 22:31:15

+0

這是通過設計:https://aspnetwebstack.codeplex.com/workitem/1928 – Jerther 2015-01-08 14:22:43

4

沒有禁用自動發現方式,這是由設計。見here

但是,有一種解決方法。您必須顯式忽略每個派生類型,然後繼續手動映射每個派生類型。這裏有一個很好的循環忽略派生類型:

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

詳情請參閱my blog post

+0

看起來像沒有使用foreach循環作爲builder.Ignore()接受數組。 – Rahul 2017-06-03 10:33:37

相關問題