I am having difficulty setting up a JSON column with my EF Core 8 setup. I have the following code:
public class CategoryVersion
{
public Guid Id { get; set; }
public Category Category { get; set; } = null!;
public required DateTime ValidfromUTC { get; set; }
public required LanguageField Name { get; set; }
public required LanguageField Description { get; set; }
public required CategoryAttributes Attributes { get; set; }
public void UpdateFromRequest(UpdateCategoryVersionRequest updateRequest)
{
ValidfromUTC = updateRequest.ValidfromUTC;
Name = updateRequest.Name;
Description = updateRequest.Description;
Attributes.UpdateFromDto(updateRequest.Attributes);
}
}
public class CategoryVersionConfiguration : IEntityTypeConfiguration<CategoryVersion>
{
public void Configure(EntityTypeBuilder<CategoryVersion> builder)
{
builder.ToTable("CategoryVersions");
builder.HasOne(v => v.Category);
builder.HasOne(v => v.Attributes);
builder.OwnsOne(v => v.Name, langField =>
{
langField.ToJson();
langField.OwnsMany(n => n.Translations, translations =>
{
translations.Property(t => t.Language);
translations.Property(t => t.Value);
});
});
builder.OwnsOne(v => v.Description, langField =>
{
langField.ToJson();
langField.OwnsMany(n => n.Translations, translations =>
{
translations.Property(t => t.Language);
translations.Property(t => t.Value);
});
});
}
}
public class LanguageField
{
public List<Translation> Translations { get; } = [];
public void AddTranslation(string language, string value)
{
Translations.Add(new Translation(language, value));
}
public string? GetTranslation(string language)
{
var translation = Translations.FirstOrDefault(t => t.Language == language)?.Value;
return translation ?? null;
}
}
public class Translation
{
public Translation(string language, string value)
{
Language = language;
Value = value;
}
public string Language { get; private set; }
public string Value { get; private set; }
}
I send in the following payload in Swagger:
{
"validfromUTC": "2024-04-23T12:21:34.381Z",
"name": {
"translations": [
{
"language": "eng",
"value": "Wine"
},
{
"language": "sv",
"value": "Vin"
}
]
},
"description": {
"translations": [
{
"language": "eng",
"value": "Wine"
},
{
"language": "sv",
"value": "Vin"
}
]
},
"attributes": {
"color": "string",
"allowDiscount": true,
"allowLoyalty": true,
"ageRestriction": 0,
"isDelegate": true
}
}
And this is the response I get:
{
"id": "03888d60-bdac-48ac-1c2e-08dc64845a13",
"validfromUTC": "2024-04-23T12:21:34.381Z",
"name": {
"translations": []
},
"description": {
"translations": []
},
"attributes": {
"color": "string",
"allowDiscount": true,
"allowLoyalty": true,
"ageRestriction": 0,
"isDelegate": true
}
}
What am I missing? Why is EF Core not mapping the Translations to JSON? I am using a local DB running in a Docker container, image mcr.microsoft.com/azure-sql-edge.
I have tried using a List but also a Dictionary<string, string> to get this to work but haven’t managed to configure it correctly.
Aljaz Kovac Caspeco is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
1