如何防止ODataConventionModelBuilder自动公开所有派生类型'元数据?

时间:2014-10-08 13:22:02

标签: c# odata asp.net-web-api2

我正在使用ODataConventionModelBuilder为Web API OData服务构建Edm Model,如下所示:

ODataModelBuilder builder = new ODataConventionModelBuilder();

builder.Namespace = "X";

builder.ContainerName = "Y";

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

IEdmModel edmModel = builder.GetEdmModel();

Z 位于一个程序集中,公共 Q 派生自 Z 位于不同的集会。

ODataConventionModelBuilder将生成 Edm Model 包含 Q 的定义(以及其他派生类),并将使用服务元数据公开。在我们的案例中这是不可取的。

当无法访问(例如定义为内部)此类问题的派生类时,确定不存在。

有没有办法强制ODataConventionModelBuilder不自动公开所有派生类型的元数据?

2 个答案:

答案 0 :(得分:8)

这应该有效:

ODataConventionModelBuilder builder = new ODataConventionModelBuilder();

builder.Namespace = "X";

builder.ContainerName = "Y";

builder.EntitySet("Z");

builder.Ignore<Q>();

IEdmModel edmModel = builder.GetEdmModel();

答案 1 :(得分: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