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

本文关键字:类型 派生 元数据 ODataConventionModelBuilder 何防止 | 更新日期: 2023-09-27 18:26:04

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

ODataModelBuilder builder = new ODataConventionModelBuilder();
builder.Namespace = "X";
builder.ContainerName = "Y";
builder.EntitySet<Z>("Z");
IEdmModel edmModel = builder.GetEdmModel();

Z位于一个程序集中,并且有公共Q派生自位于不同程序集中的Z

ODataConventionModelBuilder将生成Edm模型包括Q类(以及其他派生类)的定义,并且它将与服务元数据一起公开。在我们的情况下,这是不可取的。

当派生类不可访问(例如定义为内部)时,这样的问题当然不存在。

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

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

这应该有效:

ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
builder.Namespace = "X";
builder.ContainerName = "Y";
builder.EntitySet("Z");
builder.Ignore<Q>();
IEdmModel edmModel = builder.GetEdmModel();

没有办法禁用自动发现,这是故意的。请参见此处。

不过,有一个变通办法。您必须显式忽略每个派生类型,然后继续手动映射每个派生类型。这里有一个很好的循环来忽略派生类型:

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

查看我的博客文章了解更多详细信息。