2014-10-08 72 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

相关问题