@mr_blond97

Как смапить свойство типа 'Dictionary' в Entity Framework?

using Microsoft.EntityFrameworkCore;

namespace NameSpaceName
{
    public class WordContext : DbContext
    {
        public DbSet<VmWord> Words { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlite("Data Source=NameSpaceName.db");
        }
    }
}

namespace NameSpaceName
{
    public class VmWord
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public Dictionary<string, string> Localization { get; set; }
    }
}


Необходимо иметь доступ к элементу Localization по ключу:
word.Localization["en"];


При добавлении миграции:

The property 'VmWord.Localization' could not be mapped, because it is of type 'Dictionary' which is not a supported primitive type or a valid entity type. Either explicitly map this property, or ignore it using the '[NotMapped]' attribute or by using 'EntityTypeBuilder.Ignore' in 'OnModelCreating'.


Как смапить свойство типа 'Dictionary' в Entity Framework?
  • Вопрос задан
  • 2041 просмотр
Решения вопроса 1
@kttotto
пофиг на чем писать
Вы в одном поле собираетесь хранить целай массив? А потом, чтобы достать одно значение будете читать весь массив из поля?
Это не верный подход, но можно реализовать сериализацией массива в json при записи и при чтении - десериализацией. Например:

public class VmWord
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Localization { get; set; }

    [NotMapped]
    public Dictionary<string, string> Localizations 
    {
        get { return JsonConvert.DeseriazeObject<Dictionary<string, string>>(Localization.ToList()); }
        set { Localization = JsonConvert.SerializeObject(value); }
    }
}

Но верный подход будет по другому:

public class VmWord
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual List<string> Localizations { get; set; }
}

public class Localization
{
    public int Id { get; set; }
    public string Key { get; set; }
    public string Value { get; set; }
    public virtual VmWord VmWord { get; set; }
}

И достать по ключу потом:

context.VmWord.Localizations.FirstOrDefault(x => x.Key == key)?.Value;
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы