Как сохранить свойство IEnumerable <string>в таблице Cosmos с EF Core 3.1 - PullRequest
1 голос
/ 19 июня 2020

Мой проект использует EF Core 3.1 и нацелен на Azure Cosmos в качестве базы данных.

У меня есть такая сущность:

public class MyEntity
{
    public IEnumerable<string> Names {get;set;}
    ... other fields
}

Я бы хотел закончить в документе Cosmos следующим образом:

{
    "Names": ["Name1", "Name2"]
}

С существующей сущностью (IEnumerable<string>) я получаю сообщение об ошибке:

Свойство MyEntity.Names не может быть сопоставлен, потому что он имеет тип IEnumerable, который не является поддерживаемым примитивным типом или допустимым типом сущности.

Если я изменю сущность на:

public class NameEntity
{
    public string Name {get;set;}
}
public class MyEntity
{
    public IEnumerable<NameEntity> Names {get;set;}
    ... other fields
}

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<MyEntity>(e =>
    {
        e.OwnsMany(p => p.Identifiers);
    });
}

Документ будет выглядеть так:

{
    "Id": "XXXXXX",
    "Names:" [
       {},
       {}
    ],
}

Итак, я меняю OnModelCreating:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<MyEntity>(e =>
    {
        e.OwnsMany(p => p.Identifiers, o=> o.HasKey(k=>k.Name));
    });
}

И тогда я получаю:

{
  "Names": [
    {
        "Name": "<string1>",
        "Id": "XXXX"
    },
    {
        "Identifier": "<string2>",
        "Id": "XXXX"
    }
]}

Я также смотрел на преобразователи значений, но я думаю, что это больше для преобразования значений свойств между типами, а не для преобразования сущности в строку.

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 24 июня 2020

Вот вопрос, аналогичный вашему: Entity Framework - Code First - Can't Store List

В настоящее время невозможно сохранить список примитивного типа ( строка включена).

Лучше всего сохранить список в виде строки в своей базе данных, и когда вы его получите, вы преобразуете его обратно в список.

Как указано в приведенной выше ссылке это вы можете сделать в своем методе OnModelCreating:

modelBuilder.Entity<YourEntity>()
        .Property(e => e.Strings)
        .HasConversion(
            v => string.Join(',', v),
            v => v.Split(',', StringSplitOptions.RemoveEmptyEntries));
...