C# 排除ODataConventionModelBuilder中实现的接口
我对Web API 2和OData v3有一个奇怪的问题,特别是C# 排除ODataConventionModelBuilder中实现的接口,c#,odata,asp.net-web-api,asp.net-web-api2,C#,Odata,Asp.net Web Api,Asp.net Web Api2,我对Web API 2和OData v3有一个奇怪的问题,特别是ODataConventionModelBuilder。我的WebApiConfig.cs中有以下代码: //Web API配置和服务 var builder=新的ODataConventionModelBuilder(); //在此处添加所有实体集,然后添加复杂类型、自定义操作。。。 建造商实体集(“地址”); /* ... */ builder.AddComplexType(typeof(CustomerSearchResult
ODataConventionModelBuilder
。我的WebApiConfig.cs中有以下代码:
//Web API配置和服务
var builder=新的ODataConventionModelBuilder();
//在此处添加所有实体集,然后添加复杂类型、自定义操作。。。
建造商实体集(“地址”);
/* ... */
builder.AddComplexType(typeof(CustomerSearchResultDto));
/* ... */
var customerSearchAction=builder.Entity().Collection.Action(“搜索”);
patientSearchAction.Parameter(“模式”);
patientSearchAction.Parameter(“searchDeactivated”);
//这些是一些实体实现的接口。不得将这些数据放入模型中
var interfaces=typeof(iccustomer.Assembly.GetTypes().Where(t=>t.IsInterface.ToArray();
忽略(接口);
//建筑模型
var model=builder.GetEdmModel();
config.Routes.MapODataServiceRoute(“odata”,“odata”,model);
这些模型构建得很好,没有例外。但是一些实体实现的接口会转换为复杂类型,这当然是毫无意义的,并且会在客户端造成相当多的名称空间混乱。下面是从生成的元数据(服务:1111/$metadata)中提取的内容
我还尝试使用
builder.Ignore
,但没有效果。我做错了什么?我猜您有一个定义为IAddress的属性,例如:
public class Customer
{
public int CustomerId { get; set; }
public IAddress Address { get; set; }
...
}
因此,builder.Ignore(接口)代码>设计不起作用
如果是,您可以:
更改模型定义,使用抽象类,而不是使用接口
或者,尝试忽略该属性
我找到了更好的解决办法。在WebApiConfig.cs中,我为每个实体执行以下操作:
builder.EntitySet<Address>("Addresses").EntityType.DerivesFromNothing();
这很有效 好的,我明白了。这真的很乏味。我会给我一些DTO。谢谢我找到了解决这个问题的更好办法。但是谢谢你的提示,它帮助我找到了自己的道路:)
public class Customer
{
public int CustomerId { get; set; }
public IAddress Address { get; set; }
...
}
builder.EntitySet<Address>("Addresses").EntityType.DerivesFromNothing();
var builderMethod = builder.GetType().GetMethod("ComplexType");
foreach (var type in typeof (WebApiConfig).Assembly.GetTypes().Where(x => x.Name.EndsWith("Dto")))
{
var genericMethod = builderMethod.MakeGenericMethod(type);
genericMethod.Invoke(builder, null);
}