Как связать словарь в asp. net ядро ​​для структуры сущностей? - PullRequest
0 голосов
/ 02 апреля 2020

Моя модель содержит свойство, которое содержит необработанные значения json. Я использую базовую платформу сущностей 3 и точку net ядро ​​3.

[Table("test")]
public class PostData
{
    [Column("id"), Key]
    public int Id { get; set; }

    [Column("name")]
    public string Name { get; set; }

    [Column("properties"), JsonExtensionData]
    public virtual Dictionary<string, object> Properties { get; set; } 
}

И я сопоставил в моем контексте БД.

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<PostData>(b =>
        {
            b.Property(u => u.Properties)
                .HasConversion(
                    d => JsonConvert.SerializeObject(d),
                    s => JsonConvert.DeserializeObject<Dictionary<string, object>>(s)
                )
                .HasMaxLength(5000)
                .IsRequired();
        });
    }

Итак, когда я публикую данные из asp. net core,

{
    "name": "x",
    "properties": {
        "color": "red",
        "size": "L"
    }
}

Действие:

    [HttpPost("create")]
    public async Task<IActionResult> Create([FromBody] PostData data)
    {
        await using var context = new MyDbContext();

        await context.Post.AddAsync(data);
        await context.SaveChangesAsync();

        return await Task.FromResult(Ok(data));
    }

enter image description here

Сохраняет properties в базе данных вроде следующего.

{"color":{"ValueKind":3},"size":{"ValueKind":3}}

Почему не сериализуется?

1 Ответ

2 голосов
/ 02 апреля 2020

Я делаю снимок в темноте, основываясь на наличии значения ValueKind в данных. ValueKind является свойством JsonElement в System.Text.Json. В другом месте вы используете JSON. NET, в частности атрибут JsonExtensionData относится к JSON. NET. Я полагаю, что вы на самом деле не полностью заменили System.Text.Json и что вместо JSON. NET используется на этапе привязки модели. См. руководство по миграции для получения подробной информации о том, как использовать JSON. NET вместо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...