efcore icon indicating copy to clipboard operation
efcore copied to clipboard

Cosmos: allow excluding null values from Json document

Open aligunel opened this issue 4 years ago • 7 comments

When using

[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
  [JsonPropertyName("age")]
  public int? Age { get; set; }

This still will create null when saving data in Cosmos Db

{
"age" : null
}

or is there anyway to prevent this ? This issue tracker is for documentation

For product issues, use https://github.com/aspnet/EntityFramework/issues

aligunel avatar Nov 25 '21 14:11 aligunel

@aligunel JsonIgnore is an attribute used by the JSon serializer; it does not change the EF model. NotMapped can be used to exclude a property from the EF model.

ajcvickers avatar Nov 26 '21 09:11 ajcvickers

@aligunel JsonIgnore is an attribute used by the JSon serializer; it does not change the EF model. NotMapped can be used to exclude a property from the EF model.

Problem is I want "age" in the cosmos db document if value only exists. [Notmapped] attribute will ignore it even there is a data for the field.

aligunel avatar Nov 26 '21 10:11 aligunel

@aligunel I don't think that is supported.

ajcvickers avatar Nov 26 '21 10:11 ajcvickers

I think EF COre 6 for Cosmos db is very immature. No support for JsonSerialization options. I need to define ToJsonProperty() for each property. It is not easy to integrate to existing cosmos db.

aligunel avatar Nov 26 '21 10:11 aligunel

Consider moving HasDefaultValue to Core. When querying it would be used for missing values and for null values if the property is not nullable. If not set then above scenarios should throw.

Consider also enabling this for navigations.

Additionally, consider adding SaveWhenNotSentinel to PropertySaveBehavior. This won't send the value to the database if it's same as the sentinel (the CLR default if not specified otherwise) when used for AfterSaveBehavior.

Note that queries using these properties need to compensate for the default value is it's not just a simple projection. In cases where it's impossible to produce a compensating SQL we need to at least produce a warning.

AndriySvyryd avatar Sep 24 '24 00:09 AndriySvyryd

To continue @AndriySvyryd's comment above, we should carefully consider the interaction of this client-side default mechanism with the existing "sentinel value" mechanism we already have, which is about detecting when the user has set a property and when they haven't (e.g. for not sending a property to the database to allow it to get generated there).

Keep in mind that relational also has JSON mapping, where all of the same considerations apply as for non-relational JSON document databases.

/cc @damieng

roji avatar Sep 24 '24 05:09 roji

Related to https://github.com/dotnet/efcore/issues/21006

AndriySvyryd avatar Oct 16 '24 20:10 AndriySvyryd