我正在使用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不自动公开所有派生类型的元数据?
答案 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。