我正在使用来自第三方(仅具有读取权限)的数据库,该数据库具有可空列,该列是另一个表的外键:
Person.Id 1-* PatientFile.PatientId
PatientFile.PrescDocID 0...1 - 0...1 Person.Id
添加到URL时,我正在使用OData克隆(https://github.com/trenoncourt/AutoQueryable)来获取相关数据:?select = *
问题是可为空的列(Person.Id)有时包含id 0而不是null。这意味着PrescDoc属性在JSON响应中显示为
"prescDoc": {
"surName": null,
"firstName": null,
"isNaturalPerson": null,
"birthDate": null,
"id": 0
}
应为:
"prescDoc": null
如果prescDoc对象的ID或PatientFile.PrescDocId id为0,是否可以将EF Core配置为将PatientFile上的属性prescDoc设置为null?
我正在使用的版本:
答案 0 :(得分:1)
其他一些选择:
在您的实体类中,您可以覆盖getter:
private int? prescDocID;
public int? PrescDocID
{
get => prescDocID == 0 ? default : prescDocID;
set => prescDocID = value;
}
或者,您可以在序列化期间使用自定义的JsonConverter对其进行控制:
public class ZeroToNullConverter : JsonConverter<int?>
{
public override int? ReadJson(JsonReader reader, Type objectType, int? existingValue, bool hasExistingValue, JsonSerializer serializer) =>
reader.Value as int? == 0 ? default : reader.Value as int?;
public override void WriteJson(JsonWriter writer, int? value, JsonSerializer serializer) =>
writer.WriteValue(value == 0 ? default : value);
}
然后:
[JsonConverter(typeof(ZeroToNullConverter))]
public int? PrescDocID { get; set; }
答案 1 :(得分:0)
如果您使用的是AutoQueryable,则根据他们的文档,您可以覆盖Get方法。因此,您可以使用Select进行覆盖,以便如果id的值为0,则正在构造的Person对象可以具有prescDoc prop null:
[Route("api/[controller]")]
public class UsersController : Controller
{
[HttpGet]
[AutoQueryable]
public IQueryable<Person> Get([FromServices] myDbContext dbContext)
{
return dbContext.Person.Select(p => new Person() {
--other props go here--,
prescDoc = p.prescDoc.Id == 0 ? null: p.prescDoc
}
);
}
}