我使用ef-core将Swashbuckle添加到了.net核心Web-api项目中。 我的问题是我的ef自动生成类的虚拟属性被添加到了庄重的示例响应中,这使响应变得巨大,我只想显示表属性,而不是关系。
来自控制器的代码示例:
[HttpGet("devices", Name = "GetDevices")]
public async Task<ActionResult<List<Device>>> Devices()
{
var devices = await _deviceDa.GetDevices();
return Json(devices);
}
我的问题是ef自动生成的类位于单独的类库中,我无权更改。我不能简单地将JsonIgnore添加到这些虚拟属性中。
是否有可能让Swashbuckle忽略所有虚拟属性?
答案 0 :(得分:1)
您可以使用视图模型代替原始模型,并将字段显示在视图模型中。 将视图模型发送给客户端,而不是原始模型
答案 1 :(得分:1)
您可以实现自己的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);
答案 2 :(得分:0)
我想到了两种可能性: 首先使用自动映射器映射到您的POCO。问题是您需要警惕,但另一方面,无论如何,您以后都会获得很多控制权。
或者您可以直接使用ODATA,从本质上解决您的问题并免费查询功能。