从 swagger 响应中排除 ef 虚拟属性
Exclude ef virtual properties from swagger response
我使用 ef-core 将 Swashbuckle 添加到 .net 核心 web-api 项目中。
我的问题是我的 ef 自动生成的 classes 的虚拟属性被添加到 swagger 示例响应中,这使得响应变得巨大,我只想显示 table 属性,而不是关系。
来自控制器的代码示例:
[HttpGet("devices", Name = "GetDevices")]
public async Task<ActionResult<List<Device>>> Devices()
{
var devices = await _deviceDa.GetDevices();
return Json(devices);
}
我的问题是 ef 自动生成的 classes 在一个单独的 class 库中,我无权更改。我不能简单地将 JsonIgnore 添加到这些虚拟属性中。
是否可以让 Swashbuckle 忽略所有虚拟属性?
您可以使用视图模型代替原始模型,并将要显示的字段放在视图模型中。
代替原始模型,将视图模型发送给客户端
您可以实现自己的 ContractResolver
以在序列化模型时忽略虚拟 属性。
IgnoreVirtualContractResolver
public class IgnoreVirtualContractResolver: DefaultContractResolver
{
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
JsonProperty prop = base.CreateProperty(member, memberSerialization);
var propInfo = member as PropertyInfo;
if (propInfo != null)
{
if (propInfo.GetMethod.IsVirtual && !propInfo.GetMethod.IsFinal)
{
prop.ShouldSerialize = obj => false;
}
}
return prop;
}
}
注册
services.AddMvc()
.AddJsonOptions(options => {
options.SerializerSettings.ContractResolver = new IgnoreVirtualContractResolver();
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
我想到了两种可能性:
首先使用 automapper 映射到你的一个 POCO。问题是你需要 pocos,但另一方面,你获得了以后无论如何都需要的很多控制权。
或者您可以直接使用 ODATA,这从根本上解决了您的问题,并且免费提供查询功能。
我使用 ef-core 将 Swashbuckle 添加到 .net 核心 web-api 项目中。 我的问题是我的 ef 自动生成的 classes 的虚拟属性被添加到 swagger 示例响应中,这使得响应变得巨大,我只想显示 table 属性,而不是关系。
来自控制器的代码示例:
[HttpGet("devices", Name = "GetDevices")]
public async Task<ActionResult<List<Device>>> Devices()
{
var devices = await _deviceDa.GetDevices();
return Json(devices);
}
我的问题是 ef 自动生成的 classes 在一个单独的 class 库中,我无权更改。我不能简单地将 JsonIgnore 添加到这些虚拟属性中。
是否可以让 Swashbuckle 忽略所有虚拟属性?
您可以使用视图模型代替原始模型,并将要显示的字段放在视图模型中。 代替原始模型,将视图模型发送给客户端
您可以实现自己的 ContractResolver
以在序列化模型时忽略虚拟 属性。
IgnoreVirtualContractResolver
public class IgnoreVirtualContractResolver: DefaultContractResolver { protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) { JsonProperty prop = base.CreateProperty(member, memberSerialization); var propInfo = member as PropertyInfo; if (propInfo != null) { if (propInfo.GetMethod.IsVirtual && !propInfo.GetMethod.IsFinal) { prop.ShouldSerialize = obj => false; } } return prop; } }
注册
services.AddMvc() .AddJsonOptions(options => { options.SerializerSettings.ContractResolver = new IgnoreVirtualContractResolver(); }).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
我想到了两种可能性: 首先使用 automapper 映射到你的一个 POCO。问题是你需要 pocos,但另一方面,你获得了以后无论如何都需要的很多控制权。
或者您可以直接使用 ODATA,这从根本上解决了您的问题,并且免费提供查询功能。