Как сохранить столбцы как json, используя шаблон таблицы на иерархию (TPH) в Entity Framework Core 2 - PullRequest
1 голос
/ 02 мая 2019

Я пытаюсь сохранить таблицу, используя шаблон таблицы на иерархию, но вместо столбцов для каждого производного поля я хочу сохранить ее как json.Я просто делаю пример из раздела наследования в базовой документации ядра структуры сущности .net как таковой:

class MyContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<RssBlog>().HasBaseType<Blog>();
    }
}

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }
}

public class RssBlog : Blog
{
    public string RssUrl { get; set; }
}

Это будет работать нормально и сохранит каждое свойство в виде столбца, как показано вснимок экрана здесь:

columns

То, что я пытаюсь достичь, - это сохранение свойств в виде столбца json вместо нескольких столбцов.Вероятно, это выглядело бы примерно так:

| BlogId | Discriminator | json                                                                                          |
|--------|---------------|-----------------------------------------------------------------------------------------------|
| 1      | Blog          | {"Url": "http://blogs.msdn.com/dotnet"}                                                       |
| 2      | RssBlog       | {"Url": "http://blogs.msdn.com/adonet", "RssUrl": "http://blogs.msdn.com/b/adonet/atom.aspx"} |

Основная идея заключается в том, что я хочу хранить унаследованные объекты типа в одной и той же таблице, в точности так, как позволяет шаблон TPH, но с использованием столбца json вместонесколько столбцов.

Этого можно достичь в EF Core 2.2?

1 Ответ

1 голос
/ 02 мая 2019

Вскоре

номер


Эта функциональность не является родной для EF, и это вопрос, если будет. Но ... ты можешь сделать это сам.

Вы можете создать свой собственный репозиторий для этих объектов. Внутренне, он использует EF в качестве источника данных, и вам придется делать все сопоставления самостоятельно. Возможно, вам придется создать собственную реализацию отслеживания изменений для правильной функциональности обновления.

Второй подход может заключаться в упаковке всей сущности в поле JSON и использовании EF в качестве простого источника данных. Тогда вы можете извлечь свои сущности с помощью чего-то подобного ...:


var data = DbContext.MyPolymorphData
    .Select(x => JsonConvert.Deserialize<IPolyEntity>(x.JsonField))
    .ToList();

.. используя пакет Json.NET, который позволяет сохранять объектный тип в JSON вместе с объектными данными и десериализовать его соответственно. Но с обновлением все равно будет PITA - после обновления вы должны сериализовать данные обратно в материнскую сущность и позволить EF решить, изменилось ли что-нибудь. Тьфу.

Во всяком случае. Хранение упакованных JSON-сущностей в реляционной БД вынуждает вас поддерживать совместимость с вашей моделью сущностей. Когда вы изменяете свойства сущностей, они ломаются, если вам не удалось каким-либо образом обновить все JSON, запеченные в БД. Если у вас есть возможность, избегайте ее.

...