gpt4 book ai didi

c# - 排除 ODataConventionModelBuilder 中实现的接口(interface)

转载 作者:行者123 更新时间:2023-11-30 22:01:19 58 4
gpt4 key购买 nike

我在使用 Web API 2 和 OData v3 时遇到了一个奇怪的问题,特别是 ODataConventionModelBuilder .我的 WebApiConfig.cs 中有以下代码:

// Web API configuration and services
var builder = new ODataConventionModelBuilder();

// Adding all the entity sets here, then complex types, custom actions, ...
builder.EntitySet<Address>("Addresses");
/* ... */

builder.AddComplexType(typeof(CustomerSearchResultDto));
/* ... */

var customerSearchAction = builder.Entity<Customer>().Collection.Action("Search");
patientSearchAction.Parameter<string>("pattern");
patientSearchAction.Parameter<bool>("searchDeactivated");

// These are the interfaces that some entities implement. These MUST NOT be put into the model
var interfaces = typeof(ICustomer).Assembly.GetTypes().Where(t => t.IsInterface).ToArray();
builder.Ignore(interfaces);

// Building models
var model = builder.GetEdmModel();
config.Routes.MapODataServiceRoute("odata", "odata", model);

模型构建良好,无一异常(exception)。但是一些实体实现的接口(interface)被转换为复杂类型,这当然是荒谬的,并且会在客户端引起相当多的命名空间混淆。这是生成的元数据的摘录 (service:1111/$metadata)

<ComplexType Name="IAddress">
<Property Name="Street1" Type="Edm.String" />
<Property Name="Street2" Type="Edm.String" />
<Property Name="Zip" Type="Edm.String" />
<Property Name="City" Type="Edm.String" />
<Property Name="Country" Type="Edm.String" />
</ComplexType>

我也尝试使用 builder.Ignore<IAddress> ,但无济于事。我做错了什么?

最佳答案

我找到了更好的解决方案。在我为每个实体做的 WebApiConfig.cs 中:

builder.EntitySet<Address>("Addresses").EntityType.DerivesFromNothing();

如果实体派生自另一个,我使用 DerivesFrom() 方法。为了避免命名空间与我的复杂类型发生冲突,我使用了 DTO。因为我有很多,所以我只是像这样批量添加它们(使用反射):

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

这很好用。

关于c# - 排除 ODataConventionModelBuilder 中实现的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27816302/

58 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com