Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 排除ODataConventionModelBuilder中实现的接口_C#_Odata_Asp.net Web Api_Asp.net Web Api2 - Fatal编程技术网

C# 排除ODataConventionModelBuilder中实现的接口

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

我对Web API 2和OData v3有一个奇怪的问题,特别是
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);
    }